如何仅使用 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-recreatedocker-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 stopdocker-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 了解详细信息和选项。