拉取含Dockerfile与docker-compose的镜像后,如何调用镜像内的docker-compose?
问题解答
核心原因
你遇到的问题本质是:docker-compose.yml是Docker Compose工具的外部配置文件,并非镜像的运行依赖。你把它打包进镜像后,Docker本身不会自动读取镜像内的这个文件,docker run命令也不会识别它的配置——只有本地的docker-compose.yml才会被Docker Compose工具用来编排容器。
调用镜像内docker-compose.yml的方法
可以通过以下步骤把镜像内的docker-compose.yml提取出来,再用Docker Compose工具使用:
1. 从镜像中拷贝docker-compose.yml到本地
两种方式任选其一即可:
方式一:启动临时容器拷贝
运行以下命令,直接把镜像内的docker-compose.yml拷贝到当前工作目录:docker run --rm -v $(pwd):/host 你的镜像名 cp /docker-compose.yml /host/(
--rm表示容器退出后自动删除,-v $(pwd):/host把本地目录挂载到容器内的/host路径)方式二:不启动容器直接拷贝
先创建临时容器,再拷贝文件,最后删除临时容器:docker create --name temp-container 你的镜像名 docker cp temp-container:/docker-compose.yml ./ docker rm temp-container
2. 修改拷贝后的docker-compose.yml
你原有的docker-compose.yml里用了build字段,这是用来从本地Dockerfile构建新镜像的配置,但你已经有了拉取好的现成镜像,需要把build替换成image字段,避免重复构建:
修改后的配置示例:
version: "3" services: web: image: 你的镜像名 # 替换为你拉取的镜像的完整名称(含标签) ports: - "80:8080"
3. 用Docker Compose启动容器
进入存放修改后docker-compose.yml的目录,执行:
docker-compose up -d
这样就能按照配置启动容器,端口映射等配置会生效。
额外建议
- 后续构建镜像时,没必要把docker-compose.yml和Dockerfile打包进镜像,这属于冗余文件。可以创建
.dockerignore文件,添加以下内容来排除它们:docker-compose.yml Dockerfile - 你的Dockerfile里
ADD . .会把本地所有文件拷贝到镜像,这会导致镜像体积变大,建议只拷贝必要的文件(比如jar包),或者用更精准的拷贝命令。
内容的提问来源于stack exchange,提问作者Stefano Maglione
相关产品推荐
相关产品推荐

