docker 堆栈:从秘密中设置环境变量
docker stack: setting environment variable from secrets
我试图从 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_password: /run/secrets/password
secrets:
- password
我也有 root secrets 标签:
secrets:
password:
external: true
当我在环境中对密码进行硬编码时,它可以工作,但是当我尝试通过密码时,它却无法识别。我试图将撰写版本更改为 3.2,但没有成功。非常感谢任何指点!
您需要修改 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.yaml
中覆盖 dockerfile
和 entrypoint
键:
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_file
.
也会发生同样的情况
我发现 this neat extension Alejandro 的方法:使您的自定义入口点从 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=""
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
变量的支持时,您可以删除自定义入口点而无需更改您的撰写文件。
要详细说明最初接受的答案,只需更改您的 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
这样你就不需要任何额外的文件了!
因为您正在使用文件而不是值初始化 eureka_password。
一个选项是直接在您 运行 您的命令之前映射您的秘密:
entrypoint: "/bin/sh -c 'eureka_password=`cat /run/secrets/password` && echo $eureka_password'"
例如 MYSQL 节点的密码:
version: "3.7"
services:
app:
image: xxx
entrypoint: "/bin/sh -c 'MYSQL_PASSWORD=`cat /run/secrets/sql-pass` npm run start'"
secrets:
- sql-pass
secrets:
sql-pass:
external: true
我试图从 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_password: /run/secrets/password
secrets:
- password
我也有 root secrets 标签:
secrets:
password:
external: true
当我在环境中对密码进行硬编码时,它可以工作,但是当我尝试通过密码时,它却无法识别。我试图将撰写版本更改为 3.2,但没有成功。非常感谢任何指点!
您需要修改 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.yaml
中覆盖 dockerfile
和 entrypoint
键:
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_file
.
我发现 this neat extension Alejandro 的方法:使您的自定义入口点从 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=""
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
变量的支持时,您可以删除自定义入口点而无需更改您的撰写文件。
要详细说明最初接受的答案,只需更改您的 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
这样你就不需要任何额外的文件了!
因为您正在使用文件而不是值初始化 eureka_password。
一个选项是直接在您 运行 您的命令之前映射您的秘密:
entrypoint: "/bin/sh -c 'eureka_password=`cat /run/secrets/password` && echo $eureka_password'"
例如 MYSQL 节点的密码:
version: "3.7"
services:
app:
image: xxx
entrypoint: "/bin/sh -c 'MYSQL_PASSWORD=`cat /run/secrets/sql-pass` npm run start'"
secrets:
- sql-pass
secrets:
sql-pass:
external: true