在 docker swarm 中,我需要将环境变量设置为 docker 密钥的值。 我遵循了答案here,但它对我不起作用。
为了尝试各种选项,我创建了一个名为 testpwd 的秘密,并为 docker 堆栈制作了一个非常简单的 compose 文件,如下所示:
services:
server:
image: bash
deploy:
replicas: 1
entrypoint: ["sh", "-c", "cat /run/secrets/testpwd; TESTSEC=`cat /run/secrets/testpwd`; export TESTSEC; echo TESTSEC; echo $TESTSEC; ping stackoverflow.com"]
secrets:
- testpwd
secrets:
testpwd:
external: true
来自该堆栈启动的容器的日志显示:
密码1234
测试安全
PING stackoverflow.com (104.18.32.7):56 个数据字节 64 个字节来自 104.18.32.7:seq=0 ttl=56 时间=2.548 毫秒
/run/secrets/testpwd 中的内容是 pwd1234 但 TESTSPEC 既没有创建为该 shell 的环境变量,也没有导出。
我尝试了多种入口点变体,例如:
entrypoint: ["sh", "-c", "export TESTSEC=$$(cat /run/secrets/testpwd); ping stackoverflow.com"]
entrypoint: ["sh", "-c", "export TESTSEC=$$(cat /run/secrets/testpwd) && ping stackoverflow.com"]
以及开头链接中提到的其他内容。
但是没有任何作用。当我使用“docker exec -it cont_id sh”进入容器时,我可以看到 ping 正在运行,并在 /run/secrets/testpwd 中看到密钥的值,但没有 TESTSEC 环境变量。
以防万一,在主机中:
$docker --version
Docker version 26.1.0, build 9714adc
$docker compose version
Docker Compose version v2.26.1
$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy
stack.yaml
services:
server:
image: bash
deploy:
mode: replicated-job
replicas: 1
entrypoint:
- sh
- -c
- |
export TESTSEC=$$(cat /run/secrets/testpwd)
echo $$TESTSEC
secrets:
- testpwd
secrets:
testpwd:
file: secret.txt
> docker stack deploy -c stack.yaml test
Creating network test_default
Creating secret test_testpwd
Creating service test_server
> docker service logs test_server
test_server.0.s68pzslhjbpw@docker-desktop | Secret1234
效果很好。