在本地构建 docker compose 时如何使用秘密

L. *_*lor 9 docker docker-compose docker-buildkit

我最近开始使用 Buildkit 来隐藏一些环境变量,它在 gha 的 prod 中效果很好!

我的 Dockerfile 现在是这样的:

# syntax=docker/dockerfile:1.2
...
RUN --mount=type=secret,id=my_secret,uid=1000 \
    MY_SECRET=$(cat /run/secrets/my_secret) \
    && export MY_SECRET
Run Code Online (Sandbox Code Playgroud)

而我的正面是这样的:

DOCKER_BUILDKIT=1 docker build \
    --secret  id=my_secret,env="MY_SECRET"
Run Code Online (Sandbox Code Playgroud)

当我在我的 Github 操作上运行它时,它运行得很好。

但现在,问题是当我尝试在本地构建它时。执行时docker-compose build失败。当然,因为我没有传递任何秘密,所以我的后端(Dockerfile)将无法从run/secrets/.

到目前为止,我尝试使用以下方法完成本地构建docker-compose build

1. 使用 Docker 秘密:

我基本上尝试这样做:

$ docker swarm init
$ echo "my_secret_value" docker secret create my_secret -
Run Code Online (Sandbox Code Playgroud)

我认为保存秘密可以解决问题,但没有成功。我仍然收到相同的错误消息:

cat:无法打开“/run/secrets/my_secret”:没有这样的文件或目录

  1. 我还尝试在我的 docker-compose 文件中传递秘密,如下所示,但也不起作用:
version: '3'
services:
  app:
    build:
      context: "."
      args:
        - "MY_SECRET"
  secrets:
      - my_secret
secrets:
  my_secret:
    external: true
Run Code Online (Sandbox Code Playgroud)
  1. 我也尝试将秘密存储在本地文件中,但没有成功,同样的错误:
version: '3'
services:
  app:
    build:
      context: "."
      args:
        - "MY_SECRET"
  secrets:
      - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt
Run Code Online (Sandbox Code Playgroud)
  1. 我也尝试做类似这样的回答
args:
    - secret=id=my_secret,src=./my_secret.txt
Run Code Online (Sandbox Code Playgroud)

但仍然遇到同样的错误:

cat:无法打开“/run/secrets/my_secret”:没有这样的文件或目录

为了成功执行我做错了什么docker-compose build

我知道我可以轻松使用两个 Dockerfile,一个在本地构建的 Dockerfile 和一个在产品中构建的 Dockerfile,但我只想按原样使用 Buildkit,只需修改我的docker-compose.yml文件。

有谁知道我缺少什么才能构建本地阅读/run/secrets/

The*_*ool 22

最近在 v2 中实现了对此的支持。请参阅下面的拉取请求。

提供的示例如下所示:

services:
  frontend:
    build: 
      context: .
      secrets:
        - server-certificate
secrets:
  server-certificate:
    file: ./server.cert
Run Code Online (Sandbox Code Playgroud)

所以你已经很接近了,但是你必须在构建密钥下添加秘密密钥。

另请记住,您必须使用,docker compose来代替docker-compose, 才能使用 docker 客户端内置的 v2。