[英]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.