【发布时间】:2019-05-27 05:39:21
【问题描述】:
我正在尝试根据 docker-compose.yml 中的环境 (dev/uat/prod) 覆盖 dockerfile 中的 ENV 值。因为一些设置是敏感的,所以我不能让这些设置成为 docker 映像的构建步骤的一部分,而是必须在运行时覆盖这些值。我一直在尝试通过 docker stack deploy -c 命令部署以下 docker-compose,但是我注意到我的环境变量没有覆盖 dockerfile 中的现有变量。
Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
VOLUME /etc
ADD sample-0.0.1-SNAPSHOT.jar app.jar
ENV ENV_SETTINGS=ssldev
ENV ZK_HOST=zoo1
ENV JAVA_OPTS="-server -Xms6048m -Xmx6048m -XX:+UseParNewGC - XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:NewSize=128m -XX:MaxNewSize=128m - XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=1024 - XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=40 - XX:MaxGCPauseMillis=1000 -XX:InitiatingHeapOccupancyPercent=50 - XX:+UseCompressedOops -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 - XX:+DisableExplicitGC -Dspring.profiles.active=${ENV_SETTINGS}"
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
HEALTHCHECK CMD curl --fail -k https://localhost:8080/status || exit 1
docker-compose.yml
version: '3.1'
services:
api:
image: SOME_RANDOM_IMAGE
ports:
- "9083:8080"
networks:
- net
deploy:
restart_policy:
condition: on-failure
mode: global
environment:
- ENV_SETTINGS: default,ssldev,postgres
- ZK_HOST: zoo1:2181,zoo2:2181
networks:
nsp_net:
external:
name: net
【问题讨论】:
-
Dockerfile 中的 ENV 语句在构建镜像时会被全面评估。如果你
docker inspect你应该看到的图像在图像中$JAVA_OPTS以-Dspring.profiles.active=ssldev结尾;更改$ENV_SETTINGS不会影响这个现在固定的值。 -
我怎样才能在不使用 args 选项重建图像的情况下覆盖这些值?由于 args 只能通过要求重建来修改,其他 Docker 映像如何允许人们设置环境设置以覆盖他们的配置?
-
如果在构建过程中也对 ENV 语句进行了全面评估,那么即使有 docker-compose 的环境选项又有什么意义呢?
标签: docker docker-compose