我有一个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时,我看到一个文件'entrypoint.sh',其中包含我在Dockerfile中指定的java命令。
但是我想根据环境改变java max内存。所以我这样运行。
docker run -it <image_id> sh -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev"
但是当我运行它时,我检查了entrypoint.sh,我没有看到环境变量被替换。我错过了什么吗?
当我实际运行容器时,它是否只在运行中替换?
3条答案
按热度按时间irlmq6kh1#
您需要转义
${APP_OPTS}
中的$
(即,将其更改为\${APP_OPTS}
)-在docker build
期间,变量将被“当前”环境变量替换,也就是env
输出中的内容此时调用docker run ... -e "APP_OPTS=-Xmx9144m"
不会执行任何操作,因为${APP_OPTS}
在创建映像后已被替换。否则,您可以尝试保存
entrypoint.sh
文件并将其放在与Dockerfile
相同的文件夹中,而不是让Dockerfile
创建它(并使用COPY
将其放在您想要的位置)。xuo3flqw2#
在entrypoint.sh构建镜像时,www.example.com正在被写入,这样当你运行容器时,
RUN
语句就不会再次被执行。所以entrypoint.sh文件本身不会被更新。另一个问题是,当你运行docker时,-e选项需要在镜像名称和命令之前:
否则,这些参数将作为参数传递给入口点/命令
此外,在Dockerfile中,您可能希望在入口点脚本周围使用单引号,以便它不会在构建时插入值。
然后,当您运行容器时,入口点脚本应该在运行时从环境中读取变量值。
gcxthw6b3#
Dockerfile(和
RUN
命令)仅在构建镜像时执行。SPRING_ENV
和APP_UMPFE_OPTS
仅在构建期间执行一次。当您运行映像时,
--env=KEY=VALUE
被传递到shell(!),运行在ENTRYPOINT
或CMD
(您需要但没有)中定义的进程。在Dockerfile的顶部也缺少一个
FROM ...
语句。你需要定义(推荐shell形式)
ENTRYPOINT
,它调用java运行时,传递环境变量并运行你的代码,也许(还没有尝试过):示例:
然后: