Docker Compose文件无法构建镜像。

3
我可以帮你翻译这段内容。该项目的结构如下所示:

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-compose.yml文件在根目录吗?目标文件夹在哪里? - Andrei Stoicescu
问题已更新。 - Yves Calaci
这是因为根目录中没有目标文件夹,并且您正在从根目录运行该命令。将上下文设置为 context: ./foo,并且dockerfile只需设置为 dockerfile: Dockerfile - Andrei Stoicescu
@AndreiStoicescu,你介意详细解释一下作为答案吗?这样我可以接受它。否则我会接受David的。 - Yves Calaci
1
你可以接受David的答案,我认为他的回答很清楚,没有必要有两个答案。 - Andrei Stoicescu
1个回答

5
构建 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 中的任何路径都将相对于根目录 (.) 目录进行解释。

你实际运行的可能是:

cd foo
docker build .

或者等价地说,

docker build foo

你可以用Compose语法表达

build:
  context: foo
  # dockerfile: Dockerfile

更简洁地说
build: foo
会自动为 image:container_name: 分配合理的默认值,如果你正在本地构建镜像,就不需要显式指定它们,除非你计划将构建镜像推送到其他地方。

谢谢你,David!解释得非常清楚,build: foo 真是太棒了。不过,如果Andrei愿意回答我的问题的话,你介意我接受他的答案吗?毕竟他先回答了我。 - Yves Calaci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接