如何使用Docker Compose v2使卷永久化

我意识到其他人也有类似的问题,但这使用V2构成文件格式,我什么也没有find。

我想制作一个非常简单的testing应用程序来与MemSQL一起玩,但是在docker docker-compose down之后,我无法获得不被删除的卷。 如果我已经正确理解Docker文档,则不应删除未明确告知的卷。 一切似乎都与docker-compose up但下去后,然后再次从数据库中删除所有数据。

按照推荐的做法,我使用单独的memsqldata服务作为单独的数据层。

这是我的docker-compose.yml:

 version: '2' services: app: build: . links: - memsql memsql: image: memsql/quickstart volumes_from: - memsqldata ports: - "3306:3306" - "9000:9000" memsqldata: image: memsql/quickstart command: /bin/true volumes: - memsqldatavolume:/data volumes: memsqldatavolume: driver: local 

我意识到这是一个旧的和解决的线程,OP指向容器中的目录而不是他们已经安装的卷,但是想要清除一些我所看到的错误信息。

docker-compose down不删除卷,如果你还想删除卷,则需要运行docker-compose down -v 。 以下是从docker-compose直接获取的帮助文本(注意“默认情况下”列表):

 $ docker-compose down --help Stops containers and removes containers, networks, volumes, and images created by `up`. By default, the only things removed are: - Containers for services defined in the Compose file - Networks defined in the `networks` section of the Compose file - The default network, if one is used Networks and volumes defined as `external` are never removed. Usage: down [options] Options: ... -v, --volumes Remove named volumes declared in the `volumes` section of the Compose file and anonymous volumes attached to containers. ... $ docker-compose --version docker-compose version 1.12.0, build b31ff33 

这是一个带命名卷的示例yml,用于testing以及一个虚拟命令:

 $ cat docker-compose.vol-named.yml version: '2' volumes: data: services: test: image: busybox command: tail -f /dev/null volumes: - data:/data $ docker-compose -f docker-compose.vol-named.yml up -d Creating volume "test_data" with default driver Creating test_test_1 

启动容器后,由于图像在该位置是空的,因此将卷初始化为空。 我在那个地方创build了一个快速的hello world:

 $ docker exec -it test_test_1 /bin/sh / # ls -al /data total 8 drwxr-xr-x 2 root root 4096 May 23 01:24 . drwxr-xr-x 1 root root 4096 May 23 01:24 .. / # echo "hello volume" >/data/hello.txt / # ls -al /data total 12 drwxr-xr-x 2 root root 4096 May 23 01:24 . drwxr-xr-x 1 root root 4096 May 23 01:24 .. -rw-r--r-- 1 root root 13 May 23 01:24 hello.txt / # cat /data/hello.txt hello volume / # exit 

在Docker外部可以看到这个卷,在docker-compose down后仍然存在:

 $ docker volume ls | grep test_ local test_data $ docker-compose -f docker-compose.vol-named.yml down Stopping test_test_1 ... done Removing test_test_1 ... done Removing network test_default $ docker volume ls | grep test_ local test_data 

重新创build容器使用旧卷,该文件在里面仍然可见:

 $ docker-compose -f docker-compose.vol-named.yml up -d Creating network "test_default" with the default driver Creating test_test_1 $ docker exec -it test_test_1 /bin/sh / # cat /data/hello.txt hello volume / # exit 

然后运行docker-compose down -v最后删除容器和卷:

 $ docker-compose -f docker-compose.vol-named.yml down -v Stopping test_test_1 ... done Removing test_test_1 ... done Removing network test_default Removing volume test_data $ docker volume ls | grep test_ $ 

如果你发现你的数据只在使用stop / start而不是down / up的时候被持久化,那么你的数据被存储在容器中而不是一个容器中,容器不是永久的。 确保容器内的数据位置正确,以避免这种情况。

这可以追溯到MemSQL的一个糟糕的文档。 memsql memsql/quickstart容器中的MemSQL数据path是/memsql而不是/var/lib/memsql就像独立安装(在MemSQL文档中)一样,绝对不是像有人告诉我的那样。

不知道这是否有帮助。 当你使用docker-compose up -d ,容器被下载并创build图像。 要停止泊坞窗图像,请使用docker-compose down ,并且图像将保留并可以通过docker-compose start重新docker-compose start

我正在使用up / down命令,并一直在丢失数据,直到我尝试停止/启动,现在数据仍然存在。

你正在使用docker-compose down ,如果你看看这里的文档

停止容器并移除由up创build的容器,networking,卷和图像。 只有容器和networking默认被删除。

你是对的,它不应该删除卷(默认情况下)。 这可能是一个错误,或者你可能已经改变了默认configuration。 但我认为对你来说正确的命令是docker-compose stop 。 我会尝试用简单的情况做一些testing,

最简单的解决方法是使用docker-compose stop而不是docker-compose down 。 然后docker-compose start重启。

根据文档 , down “停止容器,并删除容器,networking,卷和图像创build。