簡體   English   中英

Docker BuildKit 返回 '/run/secrets/<secret-id> :使用 Azure DevOps 構建管道將機密傳遞給容器時,沒有此類文件或目錄</secret-id>

[英]Docker BuildKit returning '/run/secrets/<secret-id>: No such file or directory' when passing secrets to container using Azure DevOps build pipeline

我對 docker 和 DevOps 還是很陌生。 我正在嘗試將秘密傳遞給我的 Docker 容器以在構建中使用。 我讀到使用 BuildKit 可以提高安全性,因為秘密不會被放入容器中。 在按照這篇文章底部評論的步驟后,我遇到了問題https://stackoverflow.com/a/70309396這似乎完美地解決了我的問題並且看起來非常簡單明了,但是我不確定出了什么問題? 我可以使用 --build-arg 將其他環境傳遞到構建中(我沒有將它們包含在 yaml 代碼片段中),但是這種方法在 Dockerfile 階段對我來說似乎是破壞性的(我認為)。

我的構建管道將值存儲為秘密,當我將秘密回顯到文件$(Pipeline.Workspace)/direct_line_secret.txt並將其 cat 如下所示時,我得到 *** hidden value 在管道構建中返回為預期(從底部開始的第二行)。

Starting: Store direct line secret
==============================================================================
Task         : Bash
Description  : Run a Bash script on macOS, Linux, or Windows
Version      : 3.195.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash
==============================================================================
Generating script.
========================== Starting Command Output ===========================
/usr/bin/bash /home/vsts/work/_temp/070f6401-2a4d-4656-b674-4fadcce142ea.sh
***
Finishing: Store direct line secret

這是我的 yaml 文件,用於創建此腳本和 docker 構建任務。

trigger:
- main

resources:
- repo: self

variables:
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'
  DOCKER_BUILDKIT: 1

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    variables:
      DOCKER_BUILDKIT: 1
    steps:
    - bash: |
        echo ${DIRECT_LINE_SECRET} > $SECRET
        cat $SECRET
      displayName: Store direct line secret
      env:
        DIRECT_LINE_SECRET: $(nextPublicDirectLineSecret)
        SECRET: $(Pipeline.Workspace)/direct_line_secret.txt

    - task: Docker@2
      displayName: Build image
      inputs:
        command: build
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        arguments: --secret id=dl_secret,src=$(Pipeline.Workspace)/direct_line_secret.txt --build-arg [...]
        tags: |
          $(tag)

[...]

這是我的 Dockerfile


# Build target base #
#####################
FROM node:lts-alpine AS base
WORKDIR /app
ARG NODE_ENV=production \
    API_BASE \
    SIGNALR_BASE \
    DIRECT_LINE_SECRET
ENV PATH=/app/node_modules/.bin:$PATH \
    NODE_ENV="$NODE_ENV" \
    NEXT_PUBLIC_API_BASE_URL=$API_BASE \
    NEXT_PUBLIC_SIGNALR_BASE_URL=$SIGNALR_BASE
RUN apk --no-cache add curl
COPY package.json yarn.lock /app/
EXPOSE 3000

# Build target dependencies #
#############################
FROM base AS dependencies
# Install prod dependencies
RUN yarn install --production && \
    # Cache prod dependencies
    cp -R node_modules /prod_node_modules && \
    # Install dev dependencies
    yarn install --production=false

# Build target development #
############################
FROM dependencies AS development
COPY . /app
CMD [ "yarn", "dev" ]

# Build target builder #
########################
FROM base AS builder
COPY --from=dependencies /app/node_modules /app/node_modules
COPY . /app
RUN --mount=type=secret,id=dl_secret 
RUN export NEXT_PUBLIC_DIRECT_LINE_SECRET=$(cat /run/secrets/dl_secret)
RUN yarn build && \
    rm -rf node_modules

# Build target production #
###########################
FROM base AS production
COPY --from=builder /app/public /app/public
COPY --from=builder /app/.next /app/.next
COPY --from=builder /app/next.config.js /app/next.config.js
COPY --from=dependencies /prod_node_modules /app/node_modules
CMD [ "yarn", "start" ]

HEALTHCHECK --interval=5s --timeout=5s --retries=3 \
    CMD curl --fail http://localhost:3000 || exit 1

我最初將這兩條線放在頂部 RUN 線的下方,但我認為它們被調用得太早了? 移低時我仍然遇到同樣的問題...

RUN --mount=type=secret,id=dl_secret 
RUN export NEXT_PUBLIC_DIRECT_LINE_SECRET=$(cat /run/secrets/dl_secret)

這是我在 docker 構建任務的構建管道中遇到的錯誤

[...]

#12 [builder 3/5] RUN --mount=type=secret,id=dl_secret
#12 sha256:8a1115368ff855c4abf1043ef21d89bc00cfaa8759ba13fc73644e5df74a668b
#12 DONE 0.3s

#13 [builder 4/5] RUN export NEXT_PUBLIC_DIRECT_LINE_SECRET=$(cat /run/secrets/dl_secret)
#13 sha256:0e752980cf8a0ad0065c0ecc815a4f42a9c06aff4dc6de47eef68b9f01805e96
#13 0.306 cat: can't open '/run/secrets/dl_secret': No such file or directory
#13 DONE 0.3s

[...]

在閱讀 BuildKit 上的文檔時,它說要像這樣運行 docker build DOCKER_BUILDKIT=1 docker build ,或者設置變量,正如我在上面鏈接的帖子中看到的那樣,我已經完成了(我什至設置了兩次以確保它沒有放錯地方),但這就是我的 docker 命令在查看這些管道構建日志時的樣子/usr/bin/docker build -f /home/vsts/work/1/s/Dockerfile --label com.azure.dev.image.system.teamfoundationcollectionuri=https://dev.azure.com/[...]它是否應該在構建命令前面有DOCKER_BUILDKIT=1我不知道,這可能是它不工作的原因是什么?

我不確定構建有什么問題,是否是文件未創建的情況,或者只是我設置錯誤? 我花了幾個小時試圖研究這個問題,但沒有找到太多適用的信息,並且進行了 100 次編輯,但無濟於事。 也許這是一件相當簡單的事情,但我真的很急於這個周末把它整理好,我不知道接下來要嘗試什么。 我不確定如何瀏覽 DevOps 上的文件以查看是否有任何文件。

任何幫助將不勝感激!

--mount命令必須在您希望使用密鑰的同一層中使用。 您當前正在一個RUN命令中指定--mount ,然后嘗試在另一個cat命令中對已安裝的密鑰進行RUN

如果您將 Dockerfile 更改為使用單個RUN命令,則安裝的密鑰將可用:

RUN --mount=type=secret,id=dl_secret \
  export NEXT_PUBLIC_DIRECT_LINE_SECRET=$(cat /run/secrets/dl_secret)

可在此處找到 Dockefile 前端的當前語法: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md#run---mounttypesecret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM