我有一个如下的Dockerfile。
ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
RUN echo "/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties -Dspring.profiles.active=${SPRING_ENV} &" > /apps/demo/entrypoint.sh
RUN chmod +x /apps/demo/entrypoint.sh
当我运行dockerfile时,使用在Dockerfile中指定的java命令看到文件“ entrypoint.sh”。
但是我想根据环境更改Java最大内存。所以我就这样跑。
docker run -it <image_id> sh -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev"
但是,当我运行它时,我检查了entrypoint.sh,但看不到环境变量被替换。我想念什么吗?
当我实际运行容器时,它是否只能即时替换?
答案 0 :(得分:0)
您需要对$
中的${APP_OPTS}
进行转义(即,将其更改为\${APP_OPTS}
)-在docker build
期间,变量将被“当前”替换。环境变量,该变量将是env
输出中的变量(否则为null)。此时调用docker run ... -e "APP_OPTS=-Xmx9144m"
不会执行任何操作,因为创建图像后${APP_OPTS}
已被替换。
否则,您可以尝试保存entrypoint.sh
文件并将其与Dockerfile
放在同一文件夹中,而不用让Dockerfile
创建它(并使用COPY
放在您想要的位置)。这样,${APP_OPTS}
环境变量将不会在docker build
答案 1 :(得分:0)
仅在构建映像时才执行Dockerfile(和RUN
命令)。 SPRING_ENV
和APP_UMPFE_OPTS
仅在构建过程中评估一次。
运行映像时,--env=KEY=VALUE
被传递到运行ENTRYPOINT
或CMD
(您需要但没有)中定义的进程的外壳程序(!)。
在Dockerfile顶部附近也缺少一个FROM ...
语句。
您将需要定义(建议使用shell形式的)ENTRYPOINT
,以调用Java运行时,传递环境变量并运行您的代码(也许没有尝试过):
FROM ???
ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
ENTRYPOINT /usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties -Dspring.profiles.active=${SPRING_ENV}
示例:
FROM busybox
ENV DOG=Freddie
ENTRYPOINT echo ${DOG}
然后:
docker build --tag=58208029 --file=./Dockerfile .
docker run -it 58208029:latest
Freddie
docker run -it --env=DOG=Henry 58208029:latest
Henry
HTH!
答案 2 :(得分:0)
构建映像时将写入entrypoint.sh,因此在运行容器时不会再次执行RUN
语句。因此entrypoint.sh文件本身将不会更新。
另一个问题是,当您执行docker run时,-e选项必须位于映像名称和命令之前:
docker run -it -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev" <image_id> sh
否则,这些参数仅作为参数传递给入口点/命令
此外,在Dockerfile中,您可能希望在入口点脚本周围使用单引号,以免在构建时对值进行插值。
RUN echo '/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties -Dspring.profiles.active=${SPRING_ENV} &' > /apps/demo/entrypoint.sh
然后,当您运行容器时,入口点脚本应在运行时从环境读取变量值。