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

标签 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一个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实现此目的?
  • 最佳答案

    ,让我的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/

    相关文章:

    Bash - 在 if 语句中从 crontab -l 读取

    perl - 从环境变量配置 Dancer?

    docker - 如何使用 Docker 运行 Flutter Web 应用程序?

    bash - Vue init webpack 测试 - 未创建项目 - 严格模式错误?

    bash - 我需要在UNIX中测试目录

    docker - Artifactory 不会拉动 Windows 图像的某些层

    ruby - 如何更改 Docker 镜像中的 Ruby 版本(将 2.2.0 替换为 2.0.0 )

    angular - ng build 时从 nginx 获取 404 Not Found

    bash - 为什么直接运行bash脚本不需要用户权限,但是运行脚本的.app文件需要用户权限?

    bash - 如何使用bash进行http请求?