31

这个问题来自 Docker 存储库中的一个问题:
https ://github.com/docker/compose/issues/942

我无法弄清楚如何使用 docker compose 创建数据容器(没有进程运行)。

4

4 回答 4

25

更新:过去几年情况发生了变化。请参阅@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显示Exited您调用时的状态docker ps -a。进一步调查docker inspect将显示,它的时间戳为0. 这意味着容器从未运行过。就像 docker compose 的所有者在这里所说的那样。

现在,只要您不执行 a docker-compose rm -v,您的仅数据容器 ( ..._DatabaseData_1) 就不会丢失其数据。所以你可以随心所欲地docker-compose stopdocker-compose up

如果您喜欢使用像这样的专用纯数据图像,tianon/true则效果相同。在这里您不需要覆盖entrypoint,因为它不存在。该图像和 docker compose 似乎存在一些问题。我还没有尝试过,但是如果您遇到任何问题,这篇文章可能值得一读。

一般来说,为您的纯数据容器使用与访问它的容器相同的图像似乎是一个好主意。有关更多详细信息,请参阅纯数据容器疯狂

于 2015-10-02T22:42:23.757 回答
2

这个问题的其他答案已经过时了,而且数据量已经支持了一段时间了。例子:

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

于 2021-05-05T18:55:39.977 回答
2

仅数据容器 (DOC) 是一个仅用作卷提供程序而创建的容器。除了其他容器可以使用该volumes_from指令挂载它的卷之外,容器本身没有其他功能。

DOC 只需运行一次即可创建卷。即使它已停止,其他容器也可以引用其中的卷。

OP 问题:docker-compose.yml每次执行docker-compose up. OP 要求使用某种选项仅创建容器和卷而不运行它的create_only: true选项。

于 2015-10-02T14:35:07.003 回答
0

正如OP的问题中提到的那样:

  • 您可以创建一个与 中指定的同名的数据容器docker-compose.yml,然后运行docker-compose up --no-recreatedocker-compose.yml不会重新创建中指定的那个)。
  • 或者你用一个永远不会返回的简单命令运行一个容器。
    喜欢:tail -f /dev/null
于 2015-10-02T14:32:02.397 回答