【问题标题】:docker-compose secrets not being bonded/read by environment variabledocker-compose 秘密未被环境变量绑定/读取
【发布时间】:2023-01-30 20:30:12
【问题描述】:

我尝试在 docker-compose 中使用秘密(来自文件 - db_password.txt - 内容:root)。

->docker-compose -f compose-prod-replicaset.yml up --build --force-recreate

秘密通常安装在“run/secrets/db_password”文件夹中;看到那个:

[0m total 8
[0m drwxr-xr-x 2 root root 4096 Apr 22 19:34 .
[0m drwxr-xr-x 1 root root 4096 Apr 22 19:34 ..
[0m -rwxrwxrwx 1 root root 4 Apr 22 17:24 db_password

然而,当我试图将这个秘密用作环境变量(db_password)时,秘密是作为它的秘密路径,在“纯文本”(运行/秘密/db_password);

我的版本是:

  • Docker 版本 20.10.13,构建 a224086
  • docker-compose 版本 1.29.2,build 5becea4c

我已经使用 docker-compose 创建了一个 mongodb uri,如你所见用户名是“根”,但是密码被绑定为“运行/秘密/db_password”.例如:

  • mongodb://root:运行/秘密/db_password@mongo1:27017/devtestdb?authSource=admin
version: "3.9"

networks:
  api-net:

services:
  mongo1:
    container_name: mongo1
    image: mongo:4.4.4
    restart: always
    ports:
      - "27017:27017"
    networks:
      - api-net
    volumes:
      - ./db-test:/data/db

  api:
    container_name: api
    image: pauloportfolio/api
    build:
      context: ../
      dockerfile: ./docker/Dockerfile
      args:
        JAR_FILE: target/*.jar
    ports:
      - "8080:8080"
    volumes:
      - ./db-test:/data/db
    depends_on:
      - mongo1
    networks:
      - api-net
    secrets:
      - db_password
    environment:
      HOST_DB: mongo1
      PORT_DB: 27017
      AUTH_DB: admin
      STD_DB: devtestdb
      STD_USER: root
      PASS_FILE: run/secrets/db_password
      PORT_API: 8080
      DEBUG_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx1G -Xms128m -XX:MaxMetaspaceSize=128m

secrets:
  db_password:
    file: ./db_password.txt

请,任何帮助都是有用的。

非常感谢

【问题讨论】:

  • 这一切都符合预期。您需要从指定文件中读取秘密值。
  • @larsks 谢谢,快速回答。但是,它并没有获得“文件的上下文”(root),而是使用“秘密路径”作为纯文本。你有什么建议来解决这个问题吗?
  • @GtdDev 你最终解决了吗?
  • 是的..你可以在这里找到我的解决方案:github.com/codegtd/spring-webflux-replicaset

标签: docker docker-compose environment-variables docker-secrets


【解决方案1】:

如果您想将机密文件加载到环境变量中,Official MySQL Docker Image 有适合您的解决方案。

docker-entrypoint.sh中查看docker_setup_env()file_env()函数

例如-

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

结果将 /run/secrets/mysql-root 的内容加载到 MYSQL_ROOT_PASSWORD

【讨论】:

    【解决方案2】:

    我可能会推荐使用带有 docker-compose 的 .env 文件:

    您可以使用 .env 文件为环境变量设置默认值,Compose 会自动在项目目录(Compose 文件的父文件夹)中查找该文件。 - Environment variables in Compose

    # .env
    MONGODB_PASSWORD=abc123
    

    然后,你可以pass the variable to the container

    # docker-compose.yml
    ...
    services:
      mongo1:
        container_name: mongo1
        image: mongo:4.4.4
        environment:
          - MONGODB_PASSWORD=$MONGODB_PASSWORD
        restart: always
    ...
    

    在您的代码中,您需要引用 ${MONGODB_PASSWORD} 环境变量。

    【讨论】:

      【解决方案3】:

      我最终得到了这个解决方案: https://github.com/codegtd/spring-webflux-replicaset

      请检查那里。再见。

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 2021-08-15
        • 2020-09-29
        • 2018-06-14
        • 2022-11-10
        • 2015-06-17
        • 1970-01-01
        • 2021-09-28
        • 2021-09-30
        相关资源
        最近更新 更多