簡體   English   中英

將秘密傳遞給 Docker

[英]Passing Secrets to Docker

我有一個工件存儲庫(在 GitLab 上設置),其下載工件受秘密令牌保護。 當我嘗試在 Docker 映像中構建依賴於下載工件的項目時,它無法下載它們,因為它沒有帶有訪問存儲庫服務器的秘密令牌的設置文件。

我的設置

服務器在我個人的本地 maven settings.xml

    <server>
      <id>my-gitlab-maven-registry</id>
      <configuration>
        <httpHeaders>
          <property>
            <name>Deploy-Token</name>
            <value>fake-deploy-token-value</value>
          </property>
        </httpHeaders>
      </configuration>
    </server>

我項目的pom.xml中的存儲庫

    <repository>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>my-gitlab-maven-registry</id>
      <name>Main Maven Repository</name>
      <url>https://gitlab.com/api/v4/projects/1234567/packages/maven</url>
    </repository>

我的項目(簡化) Dockerfile (運行mvn package時失敗)

FROM maven:3.6.3-openjdk-15-slim AS build

COPY src /home/app/src
COPY pom.xml /home/app

RUN mvn -f /home/app/pom.xml clean package -DskipTests

我的項目(簡化) docker-compose.yml

version: "3"
services:
  my-app:
    container_name: my-app
    build: .
    ports:
      - 8080:8080

我知道一個可能的解決方案是將我的本地設置(使用絕對路徑)復制到 Docker 圖像中,但考慮到我希望這個項目被多台計算機上的多人使用,我想要一種方法來概括傳遞設置或秘密docker 映像的令牌; 所以我基本上希望任何擁有秘密令牌的人都能夠進行某種簡單的配置,以便能夠構建 Docker 映像——我想避免將秘密令牌實際上傳到版本控制的最簡單解決方案。

我的問題

那么有哪些可能的方法可以實現將用戶的 maven 設置或秘密令牌傳遞給 docker 圖像的通用解決方案?

我對解決方案的看法

一種可能的選擇是使用環境變量來保存秘密令牌,類似於用於 GitLab CI 的內容:

<!-- This environment variable is used in GitLab CI, but I could use a different name for the variable. -->
<value>${env.CI_JOB_TOKEN}</value>

但是然后使用環境變量,我不確定如何在運行docker-compose up時將環境變量傳遞給服務,而無需在docker-compose.yml中實際硬編碼環境變量。

正如你已經說過的,我會使用 env 變量 go

<value>${env.YOUR_TOKEN}</value>

在你的 Dockerfile

ARG YOUR_TOKEN
RUN mvn package

然后在你的 docker-compose.yml

version: "3"
services:
  my-app:
    container_name: my-app
    build:
      context: .
      args:
        YOUR_TOKEN: $YOUR_TOKEN
    ports:
      - 8080:8080

現在這應該工作

export YOUR_TOKEN=abc123
docker-compose build

但是您不應該上傳此構建映像,因為它在其歷史記錄中包含令牌。
如果您有一個多階段構建,並且 maven 步驟是您的構建步驟,它將被丟棄,沒關系。


更優雅的解決方案是 buildkit secrets。 但我不知道他們是否已經使用 docker compose。 See https://docs.docker.com/develop/develop-images/build_enhancements/ and How do you use Docker build secrets with Docker Compose?


如果您在運行時需要變量(docker-compose up)而不是構建時(docker-compose build),您可以這樣做:

version: "3"
services:
  my-app:
    environment:
      YOUR_TOKEN: $YOUR_TOKEN
    ports:
      - 8080:8080

然后

export YOUR_TOKEN=abc123
docker-compose up

暫無
暫無

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

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