docker - 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"
.
解决方案
据此,您需要遵循窗口 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%
看来使用powershell或cmd时必须使用$env:arg或%arg%,但使用docker命令时必须使用$arg。
推荐阅读
- c# - RS-232 无法在 Windows 10 物联网上运行
- c# - 从具有索引的数组中获取前 3 个最高值
- google-apps-script - Google脚本中的“委派被拒绝”
- c# - 两个协变接口的 C# 协方差问题
- 3d - 如何创建 USDZ 文件?
- nlp - 如何合并 2 个 LUIS 模型?
- python - 在 Antlr4 中解析字符串中的令牌
- facebook - 如何使用应用访问令牌获取 Facebook 应用的所有者电子邮件
- web-services - 启动wildfly时出现org.jboss.weld.exceptions.DefinitionException
- kakoune - Kakoune:如何在 goto 模式下映射“向前跳跃”和“向后跳跃”(例如,将“gp”映射到
)