如何在 Docker Compose 中使用机密

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

Docker Compose 为您提供了一种使用机密的方法,而无需使用环境变量来存储信息。如果您将密码和 API 密钥作为环境变量注入,则可能会面临意外信息泄露的风险。环境变量通常可供所有进程使用,并且很难跟踪访问情况。在您不知情的情况下调试错误时,它们也可以打印在日志中。使用秘密可以减轻这些风险。

使用秘密

将秘密放入容器需要两个步骤。首先,使用Compose 文件中的顶级 Secrets 元素定义机密 。接下来,更新您的服务定义以通过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填充其值的 。
  • /run/secrets/<secret_name>每个容器的部署意味着 Docker使用其特定值创建一个临时文件系统挂载。

笔记

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

资源