生成期间未替换Dockerfile占位符
使用Docker for Windows,社区版本17.06.0-ce-win19(12801),Windows 10 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
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
中使用它们一样。您可以找到我的