Dockerfile 如何传递环境变量文件并执行?

2020-07-12 12:59:47 +08:00
 zealinux

启动容器时 configMap 文件 config-env.sh,挂载到 /u/app/env

AA=123
BB=456
...大几十条...

我在 Dockerfile 中写了

ENTRYPOINT ["sh", "-c", "${WAIT_FOR} java -jar a.jar"]

ENTRYPOINT 改成了 CMD 也不行

我 K8s 传递的时候使用:

        env:
        # NOT OK
        - name: WAIT_FOR
          value: "source /u/app/env/config-env.sh && "

容器应该是启动不成功,不停重启 CrashLoopBackOff

由于平台限制,尽量使用configMap挂载文件的方式。 如果一条一条设置 env,也不好。 因为这个需要甲方人手动一个一个添加进去。 (他们不用原始的 kubectl 的 yaml 文件,而是是通过某家的 k8s 平台管理 web 操作)

3604 次点击
所在节点    Kubernetes
8 条回复
Jirajine
2020-07-12 13:08:21 +08:00
你 sh 执行的脚步里面定义的变量外面是看不到的。
直接饮用 env 文件或者把环境变量设置和程序启动命令写到一个 launcher 脚本里面,然后入口直接启动这个脚本。
yangbonis
2020-07-12 14:29:14 +08:00
你看下 oci 的 spec 文件里 entrypoint 或者 cmd 和 env 的解析顺序,如果 env 后解析,那你 entrypoint 的语句只能做成镜像里脚本,然后 sh 那个脚本。
yangbonis
2020-07-12 14:35:03 +08:00
可能加上转义就能用了
yangbonis
2020-07-12 14:51:53 +08:00
还有你这 souce 的 java 子进程看不到
leimao
2020-07-13 08:48:04 +08:00
Dockerfile 里需要有相应声明吧?
https://leimao.github.io/blog/Docker-Building-Arguments/
leimao
2020-07-13 08:59:12 +08:00
不好意思,把环境变量看成 argument 了。
leimao
2020-07-13 09:02:01 +08:00
不过你这个,instead of using env, 用 argument 就能看的到变量了。
luhuisicnu
2020-07-13 10:18:23 +08:00
java 启动参数里面可以加环境变量, -D

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX