在docker创build时运行一个bash客户端来设置一个环境variables
从我看过的例子中,可以在docker-compose.yml中设置环境variables,如下所示:
services: postgres: image: my_node_app ports: -8080:8080 environment: APP_PASSWORD: mypassword ...
出于安全原因,我的用例需要我从一个服务器获取密码,我们有一个bash客户端,用于:
#!/bin/bash get_credential <server> <dev-environment> <role> <key>
在docker文档中,我发现这个 ,说我可以将shell环境variables值传递给docker撰写。 所以我可以运行bash客户端来获取创builddocker实例的启动shell中的密码。 然而,这需要我有我的bash客户端外docker和我的maven项目。
另一种方法是运行/ cmd / entrypoint bash脚本,它可以为docker实例设置环境variables。 由于我的docker图像运行node.js,目前我的Dockerfile是这样的:
FROM node:4-slim MAINTAINER myself # ... do Dockerfile stuff # TRIAL #1: run a bash script to set the environment varable --- UNSUCCESSFUL! COPY set_en_var.sh / RUN chmod +x /set_en_var.sh RUN /bin/bash /set_en_var.sh # original entry point #ENTRYPOINT ["node", "mynodeapp.js", "configuration.js"] # TRIAL #2: use a bash script as entrypoint that sets # the environment variable and runs my node app . --- UNSUCCESSFUL TOO! ENTRYPOINT ["/entrypoint.sh"]
这里是entrypoint.sh
的代码:
. mybashclient.sh cred_str=$(get_credential <server> <dev-environment> <role> <key>) export APP_PASSWORD=( $cred_str ) # run the original entrypoint command node mynodeapp.js configuration.js
这里是我的set_en_var.sh
代码:
. mybashclient.sh cred_str=$(get_credential <server> <dev-environment> <role> <key> export APP_PASSWORD=( $cred_str )
所以2个问题:
- 哪一个更好的select,让我的bash客户端密码生活在docker或外部docker?
- 如果我在docker里面,我怎么用cmd / run / entrypoint来实现呢?
哪一个更好的select,让我的bash客户端密码生活在docker或外部docker?
一直在里面。 您不需要依赖主机操作系统。 你想尽可能地避免这种情况
如果我在docker里面,我怎么用cmd / run / entrypoint来实现呢?
考虑你使用的下面的代码行
RUN /bin/bash /set_en_var.sh
这根本行不通。 因为您没有对docker集装箱进行任何更改。 你只要运行一个bash就可以得到一些环境variables,然后bash退出,操作系统上的任何东西都不会被修改。 Dockerfile的构build只会维护从该命令发生的操作系统的变化。 在你的情况下,除了那个bash的会话,没有什么变化。
接下来在构build期间这样做的方法也是没有道理的。 如果你用它里面的环境variables来构build它,那么你打破了获取最新凭证的命令的目的。 假设你改变密码,那么这将需要你重build图像(如果它已经工作)
现在你的entrypoint.sh
方法是正确的,它应该工作。 你应该检查一下是怎么回事。 同时为您的testing回显cred_str
,以确保您从命令中获得正确的证书详细信息
最后你应该改变线路
node mynodeapp.js configuration.js
至
exec node mynodeapp.js configuration.js
这可以确保您的节点进程成为PID 1。