为什么docker-compose up似乎不同步卷

时间:2019-04-11 03:17:22

标签: docker docker-compose

这是我的docker-compose.yml的简化版本(这是buggy-service中的卷,其行为不符合我的预期):

version: '3.4'
services:

  local-db:
    image: postgres:9.6
    environment:
      - DB_NAME=${DB_NAME}
      # other env vars (not important)
    ports:
      - 5432:5432
    volumes:
      - ~/.docker-volumes/${DB_NAME}/postgresql/data:/var/lib/postgresql/data
      - postgresql:/docker-entrypoint-initdb.d

  buggy-service:
    build:
      context: .
      dockerfile: Dockerfile.test
      target: buggy-image
      args:
        # bunch of args (not important)
    volumes:
      - /Users/me/temp:/temp

volumes:

  postgresql:
    driver_opts:
      type: none
      device: /Users/me/postgresql
      o: bind

如果我执行docker-compose -f docker-compose.yml up -d local-db,则该容器将自动启动,并且我发现主机(Mac OSX)上的/Users/me/postgresql已正确绑定到/docker-entrypoint-initdb.d且内容已同步。

但是,如果我执行docker-compose -f docker-compose.yml up --build -d buggy-service,则容器不会自动启动。

问题::如何使buggy-service表现得像local-db,即自动安装所需的卷?

以下是Dockerfile.test引用的buggy-service的精简版本:

FROM microsoft/dotnet:2.1-sdk-alpine AS buggy-image

# Bunch of ARG definitions (not important)

VOLUME /temp

# other stuff (not important)

ENTRYPOINT ["/bin/bash"]

# Other FROMs

编辑1

有关我要实现的目标的更多信息...

我要使用的越野车将.Net Core作为基本映像。其目的是运行dotnet test并生成覆盖率报告,然后可以在主机中使用该报告,该主机可以是本地开发机或构建服务器(在本例中为BitBucket管道)。

1 个答案:

答案 0 :(得分:0)

  

...后跟docker run -dit --name buggy-container buggy-image

此命令创建一个新容器,而不基于yml文件中的任何内容。没有卷规范,因为您已经在Dockerfile中定义了卷,所以它只会得到一个匿名卷(我建议不要在此定义卷)。您可以使用docker volume ls命令查看匿名卷,它们将是具有长唯一ID且没有对其所属内容的引用的卷。

要从docker run定义主机卷,您需要-v标志:

docker run -dit -v /Users/me/temp:/temp --name buggy-container buggy-image

从您现在更改的问题中,您有一个新问题。您的容器指定了一个在入口点运行的命令:

ENTRYPOINT ["/bin/bash"]

bash运行时,它将从stdin读取输入。当输入结束时,例如运行没有附加输入的容器时,bash将退出。当容器运行的进程退出时,容器退出。从可用的详细信息中,我无​​法告诉您该命令应该是什么,但是一个不错的起点是查看docker hub上执行与您尝试运行的任务相似的其他映像,并查看它们的Dockerfile。使用(许多中心图像都指向带有完整源代码的GitHub存储库)。