Docker compose docker stack:从secrets设置环境变量

Docker compose docker stack:从secrets设置环境变量,docker-compose,docker-secrets,Docker Compose,Docker Secrets,我试图设置密码的秘密,但它没有拿起它。 Docker服务器版本为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_passwor

我试图设置密码的秘密,但它没有拿起它。 Docker服务器版本为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
我还有根秘密标签:

secrets:
  password:
     external: true

当我在环境中硬编码密码时,它会工作,但当我尝试通过密码时,它不会被识别。我试图将compose版本更改为3.2,但没有成功。非常感谢您的指点

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

您可以保存下一个代码入口点_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\u name或eureka\u password将被覆盖。如果你的秘密环境文件定义了相同的环境变量,那么如果你在你的服务中定义了一些环境文件,那么同样的情况也会发生:让你的自定义入口点从
env\u文件
变量加载到
env
变量:

environment:
  MYSQL_PASSWORD_FILE: /run/secrets/my_password_secret
entrypoint: /entrypoint.sh
然后在您的
入口点.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"
#/usr/bin/env bash
set-e
文件_env(){
本地变量=“$1”
本地文件var=“${var}\u文件”
local def=“${2:-}”
如果[“${!var:-}”]&&[“${!fileVar:-}”];则
echo>&2“错误:$var和$fileVar都已设置(但都是独占的)”
出口1
fi
本地val=“$def”
如果[“${!var:-}”];则
val=“${!var}”
elif[“${!fileVar:-}”];然后
val=“$(<“${!fileVar}”)”
fi
导出“$var”=“$val”
取消设置“$fileVar”
}
文件\u env“MYSQL\u密码”

然后,当上游图像更改添加了对
\u文件
变量的支持时,您可以删除自定义入口点,而无需更改您的compose文件。

要详细说明最初接受的答案,只需更改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

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

我想这可以帮到你:谢谢你。这篇文章是我提到的文章之一。唯一的区别似乎是我希望将秘密注入到环境中。我正在使用docker stack deploy,如下所述:。但由于某些原因,它并没有像预期的那样发挥作用。我确实读过一些帖子,他们建议使用command/entrypoint脚本从/run/secrets/中选择并放入环境变量。不确定这是不是唯一的办法。