如何仅使用 docker-compose.yml 创建数据容器?
how can I create a data-container only using docker-compose.yml?
此问题来自 Docker 存储库中的一个问题:
https://github.com/docker/compose/issues/942
我不知道如何使用 docker compose 创建数据容器(无进程 运行)。
正如 OP 问题中提到的那样:
- 您可以创建一个与
docker-compose.yml
中指定的同名的数据容器,并且 运行 docker-compose up --no-recreate
(docker-compose.yml
中指定的不会'无法重新创建)。
- 或者你运行一个带有简单命令的容器,从不returns。
喜欢:tail -f /dev/null
纯数据容器 (DOC) 是仅作为卷提供程序创建的容器。容器本身没有其他功能,其他容器可以使用 volumes_from
指令挂载它的卷。
DOC 只需 运行 一次即可创建卷。即使停止,其他容器也可以引用其中的卷。
OP 问题:
每次执行 docker-compose up
时,docker-compose.yml
都会启动 DOC。 OP 要求使用某种 create_only: true
选项只创建容器和卷,而不是 运行 它。
更新: 过去几年情况发生了变化。请参考@Frederik Wendt 的回答以获得一个好的和最新的解决方案。
我的旧答案:具体如何操作在一定程度上取决于您为纯数据容器使用的图像。如果您的图片有 entrypoint
,您需要在 docker-compose.yml
中覆盖它。例如,这是来自 docker hub:
的官方 MySql 图片的解决方案
DatabaseData:
image: mysql:5.6.25
entrypoint: /bin/bash
DatabaseServer:
image: mysql:5.6.25
volumes_from:
- DatabaseData
environment:
MYSQL_ROOT_PASSWORD: blabla
当您对此执行 docker-compose up
时,您将得到一个类似 ..._DatabaseData_1
的容器,当您调用 docker ps -a
时,它显示 Exited
的状态。对 docker inspect
的进一步调查将显示,它的时间戳为 0
。这意味着容器从来没有 运行。就像 docker 的所有者所说的那样,撰写 here.
现在,只要您不执行 docker-compose rm -v
,您的纯数据容器 (..._DatabaseData_1
) 就不会丢失其数据。因此,您可以随心所欲地执行 docker-compose stop
和 docker-compose up
。
如果您想使用像 tianon/true
这样的专用数据图像,这也是一样的。这里不需要覆盖entrypoint
,因为它不存在。该图像和 docker 合成似乎存在一些问题。我还没有尝试过,但如果您遇到任何问题,this article 可能值得一读。
一般来说,为您的纯数据容器使用与访问它的容器相同的图像似乎是个好主意。有关详细信息,请参阅 Data-only container madness。
这个问题的其他答案已经过时了,现在支持数据量也有一段时间了。示例:
version: "3.9"
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
见
https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose 了解详细信息和选项。
此问题来自 Docker 存储库中的一个问题:
https://github.com/docker/compose/issues/942
我不知道如何使用 docker compose 创建数据容器(无进程 运行)。
正如 OP 问题中提到的那样:
- 您可以创建一个与
docker-compose.yml
中指定的同名的数据容器,并且 运行docker-compose up --no-recreate
(docker-compose.yml
中指定的不会'无法重新创建)。 - 或者你运行一个带有简单命令的容器,从不returns。
喜欢:tail -f /dev/null
纯数据容器 (DOC) 是仅作为卷提供程序创建的容器。容器本身没有其他功能,其他容器可以使用 volumes_from
指令挂载它的卷。
DOC 只需 运行 一次即可创建卷。即使停止,其他容器也可以引用其中的卷。
OP 问题:
每次执行 docker-compose up
时,docker-compose.yml
都会启动 DOC。 OP 要求使用某种 create_only: true
选项只创建容器和卷,而不是 运行 它。
更新: 过去几年情况发生了变化。请参考@Frederik Wendt 的回答以获得一个好的和最新的解决方案。
我的旧答案:具体如何操作在一定程度上取决于您为纯数据容器使用的图像。如果您的图片有 entrypoint
,您需要在 docker-compose.yml
中覆盖它。例如,这是来自 docker hub:
DatabaseData:
image: mysql:5.6.25
entrypoint: /bin/bash
DatabaseServer:
image: mysql:5.6.25
volumes_from:
- DatabaseData
environment:
MYSQL_ROOT_PASSWORD: blabla
当您对此执行 docker-compose up
时,您将得到一个类似 ..._DatabaseData_1
的容器,当您调用 docker ps -a
时,它显示 Exited
的状态。对 docker inspect
的进一步调查将显示,它的时间戳为 0
。这意味着容器从来没有 运行。就像 docker 的所有者所说的那样,撰写 here.
现在,只要您不执行 docker-compose rm -v
,您的纯数据容器 (..._DatabaseData_1
) 就不会丢失其数据。因此,您可以随心所欲地执行 docker-compose stop
和 docker-compose up
。
如果您想使用像 tianon/true
这样的专用数据图像,这也是一样的。这里不需要覆盖entrypoint
,因为它不存在。该图像和 docker 合成似乎存在一些问题。我还没有尝试过,但如果您遇到任何问题,this article 可能值得一读。
一般来说,为您的纯数据容器使用与访问它的容器相同的图像似乎是个好主意。有关详细信息,请参阅 Data-only container madness。
这个问题的其他答案已经过时了,现在支持数据量也有一段时间了。示例:
version: "3.9"
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
见 https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose 了解详细信息和选项。