docker stack:从秘密设置环境变量

时间:2018-01-04 12:01:09

标签: docker-compose docker-secrets

我试图从密码设置密码,但它没有把它拿起来。 Docker Server版本为17.06.2-ce。我使用下面的命令来设置秘密:

echo "abcd" | docker secret create password -

我的docker compose yml文件看起来像这样

version: '3.1'
...
 build:
  context: ./test
  dockerfile: Dockerfile
environment:
  user_name: admin
  eureka_password: /run/secrets/password
secrets:
  - password

我也有root secret标签:

secrets:
  password:
     external: true

当我在环境中对密码进行硬编码时,它可以正常工作,但是当我尝试通过秘密时它不会接收。我试着把作曲版本改为3.2,但没有运气。任何指针都非常感谢!

3 个答案:

答案 0 :(得分:4)

您需要修改您的docker compose以从/ run / secrets中读取秘密env文件,如果您想通过bash方式设置环境变量,您可以覆盖docker-compose.yaml文件使用:

您可以保存下一个代码entrypoint_overwrited.sh

#get your envs files and export envars
export $(egrep  -v '^#'  /run/secrets/* | xargs) 
#if you need some specific file, where password is the secret name 
#export $(egrep  -v '^#'  /run/secrets/password| xargs) 
#call the dockerfile's entrypoint
source /docker-entrypoint.sh

在你的docker-compose中覆盖dockerfile入口点,

version: '3.1'
...
build:
  context: ./test
  dockerfile: Dockerfile
entrypoint: source /data/entrypoint_overwrited.sh
tmpfs:
  - /run/secrets
volumes:
  - /path/your/data/where/is/the/script/:/data/
environment:  
  user_name: admin
  eureka_password: /run/secrets/password
secrets:
 - password

如果您这样做,将覆盖环境变量user_name或eureka_password。如果你的秘密env文件定义了相同的env变种,如果你在服务中定义一些env_file

,也会发生同样的情况。

答案 1 :(得分:0)

我发现this neat extension是亚历杭德罗的方法:将自定义入口点负载从ENV_FILE变量加载到ENV个变量:

environment:
  MYSQL_PASSWORD_FILE: /run/secrets/my_password_secret
entrypoint: /entrypoint.sh

,然后在您的entrypoint.sh中:

#!/usr/bin/env bash

set -e

file_env() {
   local var="$1"
   local fileVar="${var}_FILE"
   local def="${2:-}"

   if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
      echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
      exit 1
   fi
   local val="$def"
   if [ "${!var:-}" ]; then
      val="${!var}"
   elif [ "${!fileVar:-}" ]; then
      val="$(< "${!fileVar}")"
   fi
   export "$var"="$val"
   unset "$fileVar"
}

file_env "MYSQL_PASSWORD"

然后,当上游映像更改添加对_FILE变量的支持时,您可以删除自定义入口点,而无需更改撰写文件。

答案 2 :(得分:0)

要详细说明最初接受的答案,只需更改您的 docker-compose.yml 文件,使其包含此作为您的入口点:

version: "3.7"
  services:
    server:
      image: alpine:latest
      secrets:
        - test
      entrypoint: [ '/bin/sh', '-c', 'export TEST=$$(cat /var/run/secrets/test) ; source /entrypoint.sh' ]
    
secrets:
  test:
    external: true

这样你就不需要任何额外的文件!