这是我的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管道)。
答案 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存储库)。