Search code examples
dockerboot2docker

Docker: filesystem changes not exporting


TL;DR My docker save/export isn't working and I don't know why.

I'm using boot2docker for Mac.

I've created a Wordpress installation proof of concept, and am using BusyBox as both the MySQL container as well as the main file system container. I created these containers using:

> docker run -v /var/lib/mysql --name=wp_datastore -d busybox
> docker run -v /var/www/html --name=http_root -d busybox

Running docker ps -a shows two containers, both based on busybox:latest. SO far so good. Then I create the Wordpress and MySQL containers, pointing to their respective data containers:

>docker run \
--name mysql_db \
-e MYSQL_ROOT_PASSWORD=somepassword \
--volumes-from wp_datastore \
-d mysql

>docker run \
--name=wp_site \
--link=mysql_db:mysql \
-p 80:80 \
--volumes-from http_root \
-d wordpress

I go to my url (boot2docker ip) and there's a brand new Wordpress application. I go ahead and set up the Wordpress site by adding a theme and some images. I then docker inspect http_root and sure enough the filesystem changes are all there.

I then commit the changed containers:

>docker commit http_root evilnode/http_root:dev
>docker commit wp_datastore evilnode/wp_datastore:dev

I verify that my new images are there. Then I save the images:

> docker save -o ~/tmp/http_root.tar evilnode/http_root:dev
> docker save -o ~/tmp/wp_datastore.tar evilnode/wp_datastore:dev

I verify that the tar files are there as well. So far, so good.

Here is where I get a bit confused. I'm not entirely sure if I need to, but I also export the containers:

> docker export http_root > ~/tmp/http_root_snapshot.tar
> docker export wp_datastore > ~/tmp/wp_datastore_snapshot.tar

So I now have 4 tar files:

  • http_root.tar (saved image)
  • wp_datastore.tar (saved image)
  • http_root_snapshot.tar (exported container)
  • wp_datastore_snapshot.tar (exported container)

I SCP these tar files to another machine, then proceed to build as follows:

>docker load -i ~/tmp/wp_datastore.tar
>docker load -i ~/tmp/http_root.tar

The images evilnode/wp_datastore:dev and evilnode/http_root:dev are loaded.

>docker run -v /var/lib/mysql --name=wp_datastore -d evilnode/wp_datastore:dev
>docker run -v /var/www/html --name=http_root -d evilnode/http_root:dev

If I understand correctly, containers were just created based on my images.

Sure enough, the containers are there. However, if I docker inspect http_root, and go to the file location aliased by /var/www/html, the directory is completely empty. OK...

So then I think I need to import into the new containers since images don't contain file system changes. I do this:

>cat http_root.snapshot.tar | docker import - http_root

I understand this to mean that I am importing a file system delta from one container into another. However, when I go back to the location aliased by /var/www/html, I see the same empty directory.

How do I export the changes from these containers?


Solution

  • Volumes are not exported with the new image. The proper way to manage data in Docker is to use a data container and use a command like docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata or docker cp to backup data and transfer it around. https://docs.docker.com/userguide/dockervolumes/#backup-restore-or-migrate-data-volumes