【问题标题】:Building two differently tagged docker images with docker-compose使用 docker-compose 构建两个不同标记的 docker 镜像
【发布时间】:2020-04-03 17:43:48
【问题描述】:

我目前正在使用 Docker 和 K8s 部署 Java 应用程序。当我使用 Raspberry Pi Kubernetes 集群时,我想生成两个图像,一个用于 x86 平台,一个用于 arm32v7(用于在 Raspberry 集群上进行测试)。目标是使用一个 Dockerfile 生成两个不同标记的 docker 镜像,并将生成的镜像推送到 Docker Hub。我使用以下 Dockerfile。

FROM openjdk:8-alpine as x86

RUN mkdir -p /usr/src/app
COPY project/generated/distributions/executable/launch.jar /usr/src/app
WORKDIR /usr/src/app
CMD java -jar launch.jar


FROM arm32v7/adoptopenjdk:8-jre-hotspot-bionic as arm32

RUN mkdir -p /usr/src/app
COPY project/generated/distributions/executable/launch.jar /usr/src/app
WORKDIR /usr/src/app
CMD java -jar launch.jar

我的docker-compose.yml 看起来像这样:

version: '3.7'
services: 
  x86:
    build:
      context: .
      dockerfile: Dockerfile
      target: project:x86_64
  arm32:
    build:
      context: .
      dockerfile: Dockerfile
      target: project:arm32

使用docker build .works,但会生成两个未命名、未标记的图像。m 我尝试了很多方法,例如硬编码 dockerfile 的路径等。尽管付出了很多努力,但我还是遇到了一个非常未定义的错误:

ERROR: failed to reach build target project:x86_64

任何想法都值得赞赏。

编辑:我的想法来自here

【问题讨论】:

    标签: docker build docker-compose multiarch


    【解决方案1】:

    对于任何想知道的人,我在一些帮助下想通了。

    docker-compose.yml 的构建部分中的目标定义不是定义目标图像。它定义了目标阶段。要指定图像,请将图像部分添加到多个阶段。 Dockerfile 中的命令之间也没有空行,解释器将在空行后停止。 这是更正后的工作代码:

    Dockerfile:

    FROM openjdk:8-alpine as x86
    RUN mkdir -p /usr/src/app
    COPY project/generated/distributions/executable/launch.jar /usr/src/app
    WORKDIR /usr/src/app
    CMD java -jar launch.jar
    
    
    FROM arm32v7/adoptopenjdk:8-jre-hotspot-bionic as arm32
    RUN mkdir -p /usr/src/app
    COPY project/generated/distributions/executable/launch.jar /usr/src/app
    WORKDIR /usr/src/app
    CMD java -jar launch.jar
    

    还有 docker-compose.yml:

    version: '3.7'
    services: 
      x86:
        build:
          context: .
          dockerfile: Dockerfile
          target: x86
        image: foo.bar.example:x86_64
      arm32:
        build:
          context: .
          dockerfile: Dockerfile
          target: arm32
        image: foo.bar.example:arm32
    

    【讨论】:

    • 非常有用。我一直在寻找一种解决方案来重用在多阶段构建中构建的图像几个小时,这是我找到的最合适的答案。谢谢。
    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多