Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Commit data in a mysql container

I created a mysql container using the officially supported mysql image. I ran the image mounting a folder that contains a sql dump, then I created a new database in the container and imported the .sql dump in it:

sudo docker run --name mysql-psat1 -v /opt/Projets/P1/sqldumps:/mnt -e MYSQL_ROOT_PASSWORD=secret -d mysql:latest
sudo docker exec -it mysql-psat1 bash
> mysql -uroot -psecret -e 'create database liferay_psat1;'
> mysql -uroot -psecret liferay_psat1 < /mnt/liferay_sql_dump.sql

Then I listed the running containers to get that container's id:

sudo docker ps -a

Then, I commited the container (with the imported sql) as a new container image

sudo docker commit -m "Imported liferay sql dump" <id-of-the-container> jihedamine/mysql-psat1:v1

However, when if I start a container using that new image, the mysql database doesn't contain the newly created database liferay_psat1.

sudo docker run -ti jihedamine/mysql-psat1:v1 bash
> mysql -uroot -psecret
# show databases;

What am I doing wrong?

Thanks for your help!

like image 666
Jihed Amine Avatar asked Jun 09 '15 19:06

Jihed Amine


People also ask

Can I commit a running container?

It can be useful to commit a container's file changes or settings into a new image. This allows you to debug a container by running an interactive shell, or to export a working dataset to another server. Generally, it is better to use Dockerfiles to manage your images in a documented and maintainable way.

Can you put a database in a container?

If you're working on a small project, and are deploying to a single machine, it's completely okay to run your database in a Docker container. Be sure to mount a volume to make the data persistent, and have backup processes in place.

What is commit command in docker?

Docker's commit command allows users to take a running container and save its current state as an image. This means to add our new user, we will need a running container. To get started, let's go ahead and launch a Redis container with the docker run command.


2 Answers

The official mysql image stores data in a volume. Normally this is desired so that your data can persist beyond the life span of your container, but data volumes bypass the Union File System and are not committed to the image.

You can accomplish what you're trying to do by creating your own mysql base image with no volumes. You will then be able to add data and commit it to an image, but any data added to a running container after the commit will be lost when the container goes away.

like image 169
dekim Avatar answered Sep 28 '22 11:09

dekim


Based on the @dekin research, I did this to solve the issue:

Dockerfile:

FROM mysql:latest

RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume

CMD ["--datadir", "/var/lib/mysql-no-volume"]

Build & run:

docker build . -t my-mysql
docker run -e MYSQL_ROOT_PASSWORD=root -it my-mysql
like image 32
Robert Avatar answered Sep 28 '22 12:09

Robert