首页 > 解决方案 > Docker compose 中的 Docker args 不会传递到 Dockerfile

问题描述

我正在使用 Windows 10 下的最新 Docker Toolbox 为 Quarkus 应用程序构建本机映像。

$ docker -v
Docker version 19.03.1, build 74b1e89e8a

docker-compose.yaml 文件:

version: '3.7' # specify docker-compose version

services:
  blogdb:
    image: postgres
    ports:
      - "5432:5432"
    restart: always
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_DB: blogdb
      POSTGRES_USER: user
    volumes:
      - ./data:/var/lib/postgresql

  post-service: 
    image: hantsy/quarkus-post-service
    build: 
      context: ./backend
      dockerfile: src/main/docker/Dockerfile.multistage
      args:
        - QUARKUS_DATASOURCE_URL
    environment:
      QUARKUS_DATASOURCE_URL: jdbc:postgresql://blogdb:5432/blogdb
    ports:
      - "8080:8080" #specify ports forewarding
    depends_on:
      - blogdb

和 Dockerfile:

## Stage 1 : build with maven builder image with native capabilities
FROM quay.io/quarkus/centos-quarkus-maven:19.1.1 AS build
ARG QUARKUS_DATASOURCE_URL
RUN echo "QUARKUS_DATASOURCE_URL>>>: $QUARKUS_DATASOURCE_URL"
ENV QUARKUS_DATASOURCE_URL $QUARKUS_DATASOURCE_URL
WORKDIR /usr/src/app
COPY pom.xml .
RUN mvn -U dependency:go-offline dependency:resolve-plugins -Pnative
COPY src/ /usr/src/app/src/
USER root
RUN chown -R quarkus /usr/src/app
USER quarkus
RUN mvn clean package -Pnative -Dquarkus.datasource.url=$QUARKUS_DATASOURCE_URL
## -DskipTests -Dmaven.test.skip=true

## Stage 2 : create the docker final image
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY --from=build /usr/src/app/target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

echo始终为 arg :打印空白QUARKUS_DATASOURCE_URL

我试图将args更改为QUARKUS_DATASOURCE_URL=${QUARKUS_DATASOURCE_URL},它仍然打印为空白。

如Docker 文档所述,它无法读取 docker-compose.yaml 文件中定义的环境。

如果直接将值设置为字符串,它可以工作,例如。QUARKUS_DATASOURCE_URL="test".

标签: dockerdocker-composedockerfilequarkus

解决方案


据此您需要遵循窗口 PowerShell 语法。

看来使用 PowerShell 或 cmd 时必须使用 $env:arg 或 %arg%,但使用 docker 命令时必须使用 $arg。

FROM microsoft/nanoserver
ARG QUARKUS_DATASOURCE_URL=some_default_value
RUN echo %QUARKUS_DATASOURCE_URL%
ENV QUARKUS_DATASOURCE_URL %QUARKUS_DATASOURCE_URL%

无法让 Docker 在文件头扩展 ARG 定义

看来使用powershell或cmd时必须使用$env:arg或%arg%,但使用docker命令时必须使用$arg。


推荐阅读