18

我试图从秘密中设置密码,但没有成功。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

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

4

5 回答 5

8

您需要修改 docker compose 以从/run/secrets. 如果你想通过 设置环境变量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覆盖dockerfileentrypoint键:

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_nameoreureka_password将被覆盖。如果您的秘密环境文件定义了相同的环境变量,那么如果您在服务中定义一些env_file.

于 2018-05-17T19:27:38.070 回答
5

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

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

于 2021-06-04T02:48:45.063 回答
1

我发现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="$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变量的支持时,您可以删除自定义入口点而不更改您的撰写文件。

于 2020-09-13T12:45:05.973 回答
0

一种选择是在运行命令之前直接映射您的秘密:

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
于 2021-11-29T14:51:13.927 回答
-1

因为您正在使用文件而不是值来初始化 eureka_password。

于 2021-08-26T15:02:30.617 回答