docker-compose 文件无法构建镜像

Hen*_*nri 3 docker dockerfile docker-compose

我有一个这样的项目结构:

root (folder)
--- foo (folder)
------ target (folder)
------ Dockerfile (file)
--- bar (folder)
------ target (folder)
------ Dockerfile (file)
--- docker-compose.yml (file)
Run Code Online (Sandbox Code Playgroud)

这是 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
Run Code Online (Sandbox Code Playgroud)

Dockerfile 两者都相同,如下所示:

FROM openjdk:8-jdk-alpine
COPY target/*.jar app.jar
CMD ["java", "-jar", "/app.jar"]
Run Code Online (Sandbox Code Playgroud)

当我尝试运行时docker-compose up,它在步骤 2(复制步骤)上失败:“未指定源文件”。当docker build .单独运行每个时,它可以工作。

我该如何解决这个问题?

Dav*_*aze 5

当您构建 Docker 映像时,您可以控制两个基本的事情。上下文目录是命令的基目录COPY;Dockerfile位置是 Dockerfile 上下文中的特定文件。在 Compose 中,您可以使用选项指定这些build: {context: ..., dockerfile: ...};在普通 Docker 中,这些是路径参数docker build-f选项。

当你的 Dockerfile 说:

build:
  context: .
  dockerfile: foo/Dockerfile
Run Code Online (Sandbox Code Playgroud)

这相当于 CLI 命令:

docker build -f foo/Dockerfile .
Run Code Online (Sandbox Code Playgroud)

...路径中的路径foo/Dockerfile将相对于root( .) 目录进行解释。

可能你实际运行的是

cd foo
docker build .
Run Code Online (Sandbox Code Playgroud)

或者,等价地,

docker build foo
Run Code Online (Sandbox Code Playgroud)

您可以用 Compose 语法来表达

build:
  context: foo
  # dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说

build: foo
Run Code Online (Sandbox Code Playgroud)

(Compose 本身将为image:和分配合理的默认值,如果您正在使用本地映像,则container_name:无需显式指定这些默认值,除非您计划将构建的映像推送到某个地方。)build: