我需要编写在 docker swarm 集群上创建服务的脚本。示例脚本类似于此:
docker service create \
--name postgres \
--mode global \
--constraint "node.labels.postgres==master" \
--network my-network \
--env POSTGRES_USER="postgres" \
--env POSTGRES_PASSWORD="****" \
postgres:10
POSTGRES_USER 和 POSTGRES_PASSWORD 环境变量应来自 docker secrets。例如:
echo "example_password" | docker secret create postgres-password -
我知道可以从正在运行的容器内部以文件形式访问密钥。但在上面的示例中,必须将其作为环境变量传递给“service create”命令。它由容器的入口点使用,因此必须在创建容器之前提供它。那么我如何将密钥传递给“docker service create”命令的 --env 开关呢?
答案1
正如这里所述https://github.com/docker-library/docs/blob/master/postgres/README.md如果您添加 _FILE 后缀,则可以在 postgres 服务中使用 swarm secrets,例如:
docker service create \
--name postgres \
--mode global \
--constraint "node.labels.postgres==master" \
--network my-network \
--secret "postgres-password" \
--env POSTGRES_USER="postgres" \
--env POSTGRES_PASSWORD_FILE="/run/secrets/postgres-password" \
postgres:10
如果您询问任何服务的通用解决方案,那么如果不创建以明文形式公开密码的容器或服务(例如,Nginx 从机密文件中读取密码),这是不可能的