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

问题描述 投票:0回答:6

我意识到其他人也有类似的问题,但这使用 v2 撰写文件格式,我没有找到任何相关内容。

我想制作一个非常简单的测试应用程序来使用 MemSQL,但我无法让卷在

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
docker docker-compose singlestore
6个回答
33
投票

我意识到这是一个旧的且已解决的线程,其中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,其中包含要测试的命名卷和虚拟命令:

$ 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

启动容器后,该卷将初始化为空,因为该位置的映像为空。我在该位置创建了一个快速的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

重新创建容器使用旧卷,其中文件仍然可见:

$ 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_

$

如果您发现您的数据仅在使用停止/启动而不是向下/向上时才被持久化,那么您的数据将存储在容器(或可能是匿名卷)而不是您的命名卷中,并且该容器是不执着。确保容器内数据的位置正确以避免这种情况。

要调试数据在容器中的存储位置,我建议在容器上使用

docker diff
。这将显示在该容器内创建、修改或删除的所有文件,当删除容器时这些文件将丢失。例如:

$ docker run --name test-diff busybox \
  /bin/sh -c "echo hello docker >/etc/hello.conf"

$ docker diff test-diff
C /etc
A /etc/hello.conf

4
投票

您正在使用

docker-compose down
如果您查看文档这里

停止容器并删除容器、网络、卷和图像 由

up
创建。默认情况下仅删除容器和网络。

你是对的,它不应该删除卷(默认情况下)。这可能是一个错误,或者您可能更改了默认配置。但我认为对你来说正确的命令是

docker-compose stop
。我将尝试使用更简单的情况对
down
命令进行一些测试。


4
投票

这可以追溯到 MemSQL 的错误文档。

memsql/quickstart
容器中的 MemSQL 数据路径是
/memsql
,而不是像独立安装(以及 MemSQL 文档中)那样的
/var/lib/memsql
,并且绝对不是像有人告诉我的那样
/data


4
投票

最简单的解决方案是使用

docker-compose stop
而不是
docker-compose down
。然后
docker-compose start
重新启动。

根据 docs

down
“停止容器并删除由 up 创建的容器、网络、卷和映像。”


3
投票

不确定这是否有帮助。当您使用

docker-compose up -d
时,将下载容器并创建图像。要停止 docker 镜像,请使用
docker-compose down
,镜像将保留并可以使用
docker-compose start

重新启动

我使用向上/向下命令并不断丢失数据,直到我尝试停止/启动,现在数据仍然存在。


0
投票

检查容器内目录的路径是否与 Docker 映像创建者使用的路径相对应。

如果不一样,每次down容器时都可能被删除。

检查此答案是否有类似情况: Docker 容器中的数据库不断被删除

© www.soinside.com 2019 - 2024. All rights reserved.