【发布时间】:2017-03-25 16:22:23
【问题描述】:
在派生的 Dockerfile 中,我遇到了一些与覆盖 CMD 相关的不一致行为。
基础 Dockerfile 如下所示:
FROM myVeryBaseImage
ENV WEBAPP_CONTEXT=my-app
WORKDIR /opt/${WEBAPP_CONTEXT}
COPY app/*.jar ./${WEBAPP_CONTEXT}.jar
COPY baseconfig/* ./config/${WEBAPP_CONTEXT}/
CMD java -jar ${WEBAPP_CONTEXT}.jar --Dspring.profiles.active=docker
此基础映像由另一个团队提供,很难更改。我现在正在编写一堆容器,我想在其中多次运行同一个应用程序,但配置不同。
所以我想我会扩展图像,将更多配置复制到其中并使用不同的弹簧配置文件运行它:
FROM baseImage
COPY config/application-*.properties ./config/${WEBAPP_CONTEXT}/
CMD java -jar ${WEBAPP_CONTEXT}.jar -Dspring.profiles.active=${PROFILE}
在 docker-compose.yml 中:
myapp-foo:
build: ./myapp-custom
image: myapp-custom
environment:
PROFILE: foo
volumes:
- /opt/my-app/foo:/opt/my-app
myapp-bar:
image: myapp-custom
environment:
PROFILE: bar
volumes:
- /opt/my-app/bar:/opt/my-app
我本来希望运行 2 个容器,分别使用 application-foo.properties 和 application-bar.properties。
不过,似乎两者都使用 appplication-docker.properties ,即基础 Dockerfile 中定义的 docker 配置文件。
如果我完全更改派生 Dockerfile 中的 CMD,它可以工作:
CMD echo "${PROFILE}"
输出分别是“foo”和“bar”。任何提示可能会发生什么?
我的版本是:
docker-compose version 1.8.1, build 878cff1
Docker version 1.12.3, build 6b644ec
更新:
在@blackibiza 的建议下,我将派生的Dockerfile 更改为
FROM baseImage
COPY config/application-*.properties ./config/${WEBAPP_CONTEXT}/
ENTRYPOINT /opt/jdk1.8.0_102/bin/java
CMD ["-jar", "${WEBAPP_CONTEXT}.jar", "-Dspring.profiles.active=foo"]
没有 docker-compose 的东西,只是看看派生的图像会是什么样子。我从 java 收到错误消息,试图运行容器。检查图像给出以下信息:
$ docker inspect --format='{{.Config.Cmd}} {{.Config.Entrypoint}}' testapp
[-jar ${WEBAPP_CONTEXT}.jar -Dspring.profiles.active=french] [/bin/sh -c /opt/jdk1.8.0_102/bin/java]
所以它仍然尝试执行/bin/sh 而不是java。这看起来不像我从文档中所期望的那样。
更新 2: 使用 CMD 的 JSON 数组语法会引发另一个问题:
FROM baseImage
COPY config/application-*.properties ./config/${WEBAPP_CONTEXT}/
CMD ["java", "-jar", "${WEBAPP_CONTEXT}.jar", "-Dspring.profiles.active=foo"]
不会扩大${WEBAPP_CONTEXT}的使用,因此会导致错误
Error: Unable to access jarfile ${WEBAPP_CONTEXT}.jar
【问题讨论】: