在docker创建时运行bash客户端来设置环境变量

时间:2017-07-27 16:38:49

标签: bash docker

从示例中我已经看到可以在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个问题:

  1. 哪个更好的选择,让我的bash客户端密码直播在docker或docker?之外?
  2. 如果我将它放在docker中,我怎么能用cmd / run / entrypoint来实现呢?

1 个答案:

答案 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。