在 Docker Compose 中安全地管理秘密

秘密是任何不应通过网络传输或以未加密形式存储在 Dockerfile 或应用程序源代码中的数据,例如密码、证书或 API 密钥。

Docker Compose 提供了一种使用秘密而无需使用环境变量来存储信息的方法。如果您将密码和 API 密钥作为环境变量注入,则存在无意信息泄露的风险。服务只能在顶层 services 元素中的 secrets 属性明确授予访问权限时才能访问秘密。

环境变量通常对所有进程都可用,并且可能难以跟踪访问。在调试错误时,它们还可能在您不知情的情况下打印在日志中。使用秘密可以缓解这些风险。

使用秘密

秘密以文件形式挂载到容器内的 /run/secrets/<secret_name> 中。

将秘密导入容器是一个两步过程。首先,在 Compose 文件中的顶层 secret 元素 中定义秘密。接下来,更新您的服务定义,以 secrets 属性 引用它们所需的秘密。Compose 按服务授予秘密访问权限。

与其他方法不同,这允许通过标准文件系统权限在服务容器内进行精细的访问控制。

示例

单服务秘密注入

在以下示例中,前端服务被授予访问 my_secret 秘密的权限。在容器中,/run/secrets/my_secret 设置为文件 ./my_secret.txt 的内容。

services:
  myapp:
    image: myapp:latest
    secrets:
      - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

多服务秘密共享和密码管理

services:
   db:
     image: mysql:latest
     volumes:
       - db_data:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD_FILE: /run/secrets/db_password
     secrets:
       - db_root_password
       - db_password

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
     secrets:
       - db_password


secrets:
   db_password:
     file: db_password.txt
   db_root_password:
     file: db_root_password.txt

volumes:
    db_data:

在上面的高级示例中

  • 每个服务下的 secrets 属性定义了您想要注入到特定容器中的秘密。
  • 顶层 secrets 部分定义了变量 db_passworddb_root_password,并提供了填充其值的 file
  • 每个容器的部署意味着 Docker 会在 /run/secrets/<secret_name> 下创建带有其特定值的绑定挂载。
注意

这里演示的 _FILE 环境变量是某些镜像(包括 Docker 官方镜像,如 mysqlpostgres)使用的一种约定。

构建机密

在以下示例中,npm_token 秘密在构建时可用。其值取自 NPM_TOKEN 环境变量。

services:
  myapp:
    build:
      secrets:
        - npm_token
      context: .

secrets:
  npm_token:
    environment: NPM_TOKEN

资源

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.