从示例中我已经看到可以在docker-compose.yml中设置环境变量,如下所示:
services:
postgres:
image: my_node_app
ports: -8080:8080
environment:
APP_PASSWORD: mypassword
...
出于安全考虑,我的用例要求我从我们有bash客户端的服务器上获取密码:
#!/bin/bash
get_credential <server> <dev-environment> <role> <key>
在docker文档中,我找到了this,它说我可以将shell环境变量值传递给docker compose。所以我可以运行bash客户端来获取创建docker实例的起始shell中的密码。但是,这需要我将我的bash客户端置于docker之外和maven项目中。
另一种方法是运行/ cmd / entrypoint一个可以为docker实例设置环境变量的bash脚本。由于我的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个问题:
答案 0 :(得分:0)
哪个更好的选择,让我的bash客户端密码在Docker或docker之外?
始终把它放在里面。您不希望在主机操作系统上存在依赖关系。你想尽可能避免这种情况
如果我要在docker中使用它,我怎样才能使用cmd / run / entrypoint来实现这个目标?
考虑您使用的以下代码行
RUN /bin/bash /set_en_var.sh
这根本不起作用。因为您不会对docker容器进行任何更改。你只需要运行一个bash来获取一些环境变量,然后bash退出,操作系统上的任何内容都不会发生变化。 Dockerfile构建只会维护该命令对操作系统发生的更改。在你的情况下除了bash的那个会话,没有任何改变。
接下来,在构建期间执行此操作的方法也是不合理的。如果您使用其中的环境变量构建它,那么您将破坏获取最新凭据的命令的目的。假设您更改了密码,那么这将需要您重建图像(如果它已经工作)
现在您的entrypoint.sh
方法是正确的,它应该有效。你应该检查一下它出了什么问题。同时回复cred_str
进行测试,以确保从命令
最后你应该改变一行
node mynodeapp.js configuration.js
到
exec node mynodeapp.js configuration.js
这可确保您的节点进程成为PID 1。