在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个问题:

  1. 哪一个更好的select,让我的bash客户端密码生活在docker或外部docker?
  2. 如果我在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。