docker-compose 相当于 Docker Build --secret 参数

Val*_*res 7 environment-variables docker dockerfile docker-compose

我们使用此处详述的技术以安全的方式将主机环境变量公开给 Docker 构建。

# syntax=docker/dockerfile:1.2
FROM golang:1.18 AS builder

# move secrets out of the build process (and docker history)
RUN --mount=type=secret,id=github_token,dst=/app/secret_github_token,required=true,uid=10001 \
    export GITHUB_TOKEN=$(cat /app/secret_github_token) && \
    <nice command that uses $GITHUB_TOKEN>
Run Code Online (Sandbox Code Playgroud)

这个命令来构建图像:

# syntax=docker/dockerfile:1.2
FROM golang:1.18 AS builder

# move secrets out of the build process (and docker history)
RUN --mount=type=secret,id=github_token,dst=/app/secret_github_token,required=true,uid=10001 \
    export GITHUB_TOKEN=$(cat /app/secret_github_token) && \
    <nice command that uses $GITHUB_TOKEN>
Run Code Online (Sandbox Code Playgroud)

以上效果完美。

现在我们还有一个在 CI 中运行的 docker-compose 文件需要修改。但是,即使我确认该作业中存在 ENV 变量,我也不知道如何将环境变量分配给指定github_token的秘密 ID。

换句话说,可以接受具有秘密 ID 的环境变量映射的等效 docker-compose 命令(up --build 或 build)是什么?

Val*_*res 7

事实证明我有点领先于时代。docker compose v.2.5.0 带来了对 Secrets 的支持

按照上面的说明修改 Dockerfile 后,我们必须将 docker-compose 更新为已定义的secrets.

docker-compose.yml

services:
  my-cool-app:
    build:
      context: .
      secrets:
        - github_user
        - github_token
...
secrets:
  github_user:
    file: secrets_github_user
  github_token:
    file: secrets_github_token
Run Code Online (Sandbox Code Playgroud)

但这些文件在哪里secrets_github_user并且secrets_github_token来自哪里?在 CI 中,您还需要导出环境变量并将其保存到默认机密文件位置。在我们的项目中,我们使用任务,因此我们也添加了这些行。

请注意,我们正在从 CI 运行此任务,因此您可以在没有任务的情况下以不同的方式执行此任务。

- printenv GITHUB_USER > /root/project/secrets_github_user
- printenv GITHUB_TOKEN > /root/project/secrets_github_token
Run Code Online (Sandbox Code Playgroud)

然后我们更新 CircleCI 配置并向我们的作业添加两个环境变量:

.config.yml

- printenv GITHUB_USER > /root/project/secrets_github_user
- printenv GITHUB_TOKEN > /root/project/secrets_github_token
Run Code Online (Sandbox Code Playgroud)

您可能还需要更新的 Docker 版本,我认为他们在 19 年底或 20 年初发布了它。我已经使用过它并且它有效:

  name-of-our-job:
    environment:
      DOCKER_BUILDKIT: 1
      COMPOSE_DOCKER_CLI_BUILD: 1
Run Code Online (Sandbox Code Playgroud)

现在,当运行基于 docker-compose 的命令时,秘密应该通过 docker-compose 成功安装,并且可用于正确构建或运行 Dockerfile 指令!