首页 > 解决方案 > 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 .,它可以工作。

我该如何解决这个问题?

标签: dockerdocker-composedockerfile

解决方案


当你构建一个 Docker 镜像时,你可以控制两个基本的东西。上下文目录是命令的基本目录COPYDockerfile 位置是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:,除非你打算将构建的图像推送到某个地方。)


推荐阅读