【问题标题】:Secrets in docker composedocker compose 中的秘密
【发布时间】:2020-02-04 00:38:55
【问题描述】:

我的环境是 ubuntu 18.04 VPS。

我无法在 docker 容器中使用 mariadb 获取基于文件的机密。

  1. 创建docker-compose.yml:
version: '3.7'
services:
  db:
    image: mariadb:10.4.8-bionic
    environment:
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/password_root
      - MYSQL_PASSWORD_FILE=/run/secrets/password_user
      - MYSQL_DATABASE=database
      - MYSQL_USER=admin
    secrets:
      - password_root
      - password_user
secrets:
  password_root:
    file: .secret_password_root
  password_user:
    file: .secret_password_user
  1. 创建秘密:
echo -n secret > .secret_password_root
echo -n secret > .secret_password_user
chown root:root .secret_password*
chmod 400 .secret_password*

(请注意,我可以设置 444,但这会暴露主机上的机密文件,这是一个非常糟糕的主意。)

  1. 运行:
docker-compose up

错误:

db_1 | /usr/local/bin/docker-entrypoint.sh:第 37 行:/run/secrets/password_root:权限被拒绝

根据the docs,秘密文件应该挂载为0444,但这显然不会发生。

【问题讨论】:

  • 它在错误消息中显示 /run/secrets/db_password_root,但您的 compose 中没有此文件。

标签: linux docker docker-compose


【解决方案1】:

显然this is not supported 用于“docker compose”,仅用于“docker swarm”。文档具有误导性。

Docker Compose 不支持真实的(swarmkit)秘密,并通过将文件直接绑定挂载到容器中来模仿它们(这意味着主机上的权限与容器中的权限相同)。

您可以更改主机上文件的所有权以匹配容器中用户的uid/gid,否则我认为不幸的是没有太多可以做的事情

【讨论】:

  • 那很臭,我一直在努力让它发挥作用,并点击您的评论解释了为什么它没有。在构建过程中使用 docker-compose 和 Dockerfile 隐藏令牌有什么好的建议吗?我不希望任何人意外提交的令牌。谢谢!
  • @nyhunter77 我想你可以使用.env 文件?
  • 你会这么认为@lonix,我也是,但我在构建期间需要这些值,而不是运行。昨晚想通了。我实际上在 Dockerfile 中设置了一个默认 arg,这样真正的 arg 不会被提交到 git 中,然后当我运行 docker-compose 时,我运行: docker-compose build --build-arg JOB_TOKEN=这似乎符合现在的需求!一天多来一直试图想出一个体面的解决方案。 :)
【解决方案2】:

提示点在这里:

chown root:root .secret_password* # set root as owner
chown 400 .secret_password*       # set `400` as owner

chown 替换为`chmod:

chown root:root .secret_password*
chmod 400 .secret_password*

【讨论】:

  • 很好......这是一个错字,但不幸的是它并没有改变问题:(
猜你喜欢
  • 2021-01-21
  • 2020-10-21
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2023-01-30
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多