从示例中,我已经看到可以像这样在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一个bash脚本,该脚本可以为docker实例设置环境变量。由于我的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 )
所以有两个问题:
最佳答案
,让我的bash客户端密码在docker内还是在docker外,哪个是更好的选择?
始终将其放入内部。您不希望依赖于主机操作系统。您想要尽可能避免这种情况
如果要在docker中使用它,如何使用cmd / run / entrypoint实现此目的?
考虑下面的代码行
RUN /bin/bash /set_en_var.sh
这根本不起作用。因为您不会对Docker容器进行任何更改。您只需运行一个bash即可获取一些环境变量,然后bash退出并且OS上的任何内容都无法更改。 Dockerfile构建将仅维护该命令对操作系统进行的更改。在您的情况下,除了那次bash操作外,其他都没有改变。
接下来,在构建期间执行此操作的方法也不合理。如果使用内部环境变量来构建它,那么您将违反使用命令获取最新凭据的目的。假设您更改了密码,那么这将需要您重建镜像(如果它已经起作用)
现在,您的
entrypoint.sh
方法是正确的方法,它应该可以工作。您应该只检查问题所在。还回显cred_str
进行测试,以确保从命令返回正确的凭据详细信息最后你应该换行
node mynodeapp.js configuration.js
至
exec node mynodeapp.js configuration.js
这可以确保您的节点进程成为PID 1。
关于bash - 在docker创建时运行bash客户端以设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356500/