将秘密传递给 Docker

时间:2021-04-07 16:06:33

标签: docker maven docker-compose

我有一个工件存储库(在 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 中实际硬编码环境变量。

1 个答案:

答案 0 :(得分:1)

我会使用 env 变量,正如你已经说过的

<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。请参阅 https://docs.docker.com/develop/develop-images/build_enhancements/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