docker - docker-compose 文件无法构建图像
问题描述
我有一个这样的项目结构:
root (folder)
--- foo (folder)
------ target (folder)
------ Dockerfile (file)
--- bar (folder)
------ target (folder)
------ Dockerfile (file)
--- docker-compose.yml (file)
这是 docker-compose 文件:
version: "3.9"
services:
foo-service:
image: foo-image:latest
container_name: foo-container
build:
context: .
dockerfile: foo/Dockerfile
bar-service:
image: bar-image:latest
container_name: bar-container
build:
context: .
dockerfile: bar/Dockerfile
Dockerfile 等于两者,如下所示:
FROM openjdk:8-jdk-alpine
COPY target/*.jar app.jar
CMD ["java", "-jar", "/app.jar"]
当我尝试运行docker-compose up
时,它在第 2 步(复制步骤)失败:“未指定源文件”。当单独运行每个时docker build .
,它可以工作。
我该如何解决这个问题?
解决方案
当你构建一个 Docker 镜像时,你可以控制两个基本的东西。上下文目录是命令的基本目录COPY
;Dockerfile 位置是Dockerfile上下文中的特定文件。在 Compose 中,您可以使用build: {context: ..., dockerfile: ...}
选项指定这些;在普通的 Docker 中,这些是路径参数docker build
和-f
选项。
当你的 Dockerfile 说:
build:
context: .
dockerfile: foo/Dockerfile
这相当于 CLI 命令:
docker build -f foo/Dockerfile .
...和路径foo/Dockerfile
将相对于root
( .
) 目录进行解释。
可能你实际运行的是
cd foo
docker build .
或者,等效地,
docker build foo
您可以用 Compose 语法表达
build:
context: foo
# dockerfile: Dockerfile
或更简洁地说
build: foo
(Compose 自己会为image:
and分配合理的默认值,container_name:
如果你是本地图像,你不需要明确指定这些build:
,除非你打算将构建的图像推送到某个地方。)
推荐阅读
- python - 你如何创建一个 django rest 框架 ListCreateAPIView?
- assembly - 如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中
- json - 如何将 JSON(字符串数据)传递给 PowerShell?
- python - 熊猫根据条件用值填充列
- marklogic - 如何通过 docFilter 从提取的文档中检索特定值?
- php - PHP Soap Client 版本错误,SOAP 服务器返回正确响应
- linux - 为什么 Linux 的 CFS 调度程序中正在运行的进程的 vruntime 会减少?
- reactjs - 将 react-loadable 与 renderToNodeStream 一起使用
- reactjs - react-router-dom 不在路由更改时渲染组件
- python - 从网页中获取图像的 Python 脚本抛出错误:需要一个字符缓冲区对象