生成期间未替换Dockerfile占位符

生成期间未替换Dockerfile占位符,docker,dockerfile,Docker,Dockerfile,使用Docker for Windows,社区版本17.06.0-ce-win19(12801),Windows 10 Dockerfile FROM frolvlad/alpine-oraclejdk8:slim ARG APP_NAME=client-default RUN mkdir -p /client/ ADD build/libs/$APP_NAME.jar /client/$APP_NAME.jar ENTRYPOINT ["java", "-jar", "/client/$APP

使用Docker for Windows,社区版本17.06.0-ce-win19(12801),Windows 10

Dockerfile

FROM frolvlad/alpine-oraclejdk8:slim
ARG APP_NAME=client-default
RUN mkdir -p /client/
ADD build/libs/$APP_NAME.jar /client/$APP_NAME.jar
ENTRYPOINT ["java", "-jar", "/client/$APP_NAME.jar"]
运行

docker build --build-arg APP_NAME=client-1 -t test/client-1 .
生成后未替换占位符(已尝试${APP\u NAME},%APP\u NAME%)


ARG仅在构建Docker映像(运行等)期间可用,而不是在创建映像并从映像启动容器后可用(ENTRYPOINT或CMD)

在Dockerfile中未替换ARG变量。ARG实际上是一个环境变量。在构建过程中,docker使用ARG变量作为环境变量“运行”容器。易于证明(您可以测试):尝试在Dockerfile上运行printenv,您将看到ARG作为环境变量

所以,你有两个问题:

第一名:

console中的步骤不能替代ARG变量。因此,您的jar实际上在容器中,您的行:

ADD build/libs/$APP_NAME.jar /client/$APP_NAME.jar

它起作用了。试试看

秒:

Entrypoint用于运行的容器,而不是映像,因此您需要将ARG放入ENV变量中,而不是使用exec表单。如果您使用ENTRYPOINT的exec表单,则不会调用命令shell。这意味着正常的shell处理不会发生。如果需要shell处理,请使用shell表单或直接执行shell,例如:

ENTRYPOINT cat ${APP_NAME_RUN}
因此,请尝试以下工作示例:

FROM ubuntu
ARG APP_NAME=client
RUN mkdir -p /client/
ADD ./$APP_NAME.txt /client/$APP_NAME.txt
ENV APP_NAME_RUN="/client/${APP_NAME}.txt"
RUN echo $APP_NAME_RUN
ENTRYPOINT cat ${APP_NAME_RUN}
当您在
[]
中使用EXEC表单时。如果
ENTRYPOINT
CMD
使用shell表单(字符串,而不是数组),shell将能够为您执行变量替换


ARG
ENV
变量将在容器中的
RUN
命令中作为环境变量提供

Docker还将按照以下说明替换
Dockerfile
中的
$VARIABLES

  • 抄袭
  • 环境
  • 暴露
  • 标签
  • 停车信号
  • 使用者
  • WORKDIR
只有
ENV
变量在
CMD
ENTRYPOINT
中可用,仅在运行容器的环境中可用:

使用
ARG

FROM frolvlad/alpine-oraclejdk8:slim
ARG APP_NAME=client-default
ENV APP_NAME=$APP_NAME
RUN mkdir -p /client/
ADD build/libs/$APP_NAME.jar /client/$APP_NAME.jar
ENTRYPOINT ["sh", "-c", "java -jar /client/$APP_NAME.jar"]
或仅使用
ENV

FROM frolvlad/alpine-oraclejdk8:slim
ENV APP_NAME=client-default
RUN mkdir -p /client/
ADD build/libs/$APP_NAME.jar /client/$APP_NAME.jar
ENTRYPOINT ["sh", "-c", "java -jar /client/$APP_NAME.jar"]

Dockerfile中的环境变量是用
ENV
语句声明的

就你而言:

FROM frolvlad/alpine-oraclejdk8:slim
ENV APP_NAME client-default
RUN mkdir -p /client/
ADD build/libs/${APP_NAME}.jar /client/${APP_NAME}.jar
ENTRYPOINT ["java", "-jar", "/client/${APP_NAME}.jar"]

ARG与ENV分开,后者设置一个环境变量。No。两者都是环境变量。ARG是一个仅在构建时使用的环境变量。ENV是运行容器时保留的环境变量。ARG只是构建时使用的环境变量。不完全是。在Dockerfile中未替换ARG变量。ARG实际上是一个环境变量。在构建过程中,docker使用ARG变量作为环境变量“运行”容器。易于证明(您可以测试):在Dockerfile上尝试“运行printenv”,您将看到ARG作为环境变量。很酷,我没有意识到docker在运行时使用环境变量作为ARGs的接口!删除了该评论。但是,
ARG
也会被该命令列表所取代
ARG test=what
ADD$test other
docker run IMAGE cat/other
也可以工作,并且在那里不使用env vars,因为您突出显示了那些命令没有环境。我希望在图像生成过程中可以找到一种方法来替换ADD指令a.k.a中的某种占位符。命令docker build--build arg app_name=client-t test/client。不起作用。是否有另一种方法可以在不知道前面的.jar名称的情况下动态地将已构建的.jar文件添加到图像中?
ARG
ENV
vars应该起作用,就像您在
add
中使用它们一样。您可以找到我的