这是我的 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
,它的容器会自动启动,我发现 /Users/me/postgresql
在主机 (Mac OSX) 上正确绑定(bind)到 /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
关于我正在努力实现的目标的更多信息......
我正在尝试使用的 buggy-container 运行 .Net Core 作为基础镜像。它的目的是运行
dotnet test
并生成覆盖率报告,然后可以在主机中使用,主机可以是本地开发机器或构建服务器(在本例中为 BitBucket 管道)。
最佳答案
... followed by
docker run -dit --name buggy-container buggy-image
此命令创建一个新容器,而不是基于 compose 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 运行时,它从标准输入读取输入。当该输入结束时,例如当您运行没有附加输入的容器时,bash 将退出。当您的容器运行的进程退出时,容器将退出。根据可用的详细信息,我无法告诉您该命令应该是什么,但一个好的起点是查看 docker hub 上执行您尝试运行的类似任务的其他图像,并查看他们的 Dockerfile使用(许多中心图像指向具有完整源代码的 GitHub 存储库)。
关于docker - 为什么 docker-compose up 似乎不同步卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55624175/