【问题标题】:Docker-compose - setting environment variables that are not literalsDocker-compose - 设置不是文字的环境变量
【发布时间】:2020-02-25 17:24:19
【问题描述】:

我已经在 Docker 容器中设置了 Jenkins,我正在尝试使用该服务器访问我的私有 Bitbucket 存储库。我需要将我的 SSH 密钥复制到该容器中,以便 Bitbucket 识别它,然后我可以让我的 Jenkins 服务器访问该存储库。

我的 docker-compose.yml 文件中有以下内容:

services:
  jenkins:
    build: .
    volumes:
      - jenkins-data:/var/jenkins_home
    environment:
      - SSH_PRIVATE_KEY=$(cat ~/.ssh/id_rsa)
    ports:
      - "8080:8080"
      - "50000:50000"

volumes:
  jenkins-data:

然而,echo $SSH_PRIVATE_KEY 给出了/.ssh/id_rsa,而不是存储在里面的值。我听说在 Dockerfile 中执行此操作的问题在于,它仍然可以在将要推送的图像的一层中查看。

我的问题是如何将SSH_PRIVATE_KEY 的值设置为我的文件内容的值?

我相信这可能与 How to set environment variable into docker container using docker-compose 重复,但该解决方案似乎对我没有任何改变。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    您可以在运行 compose 的 shell 中创建一个环境变量:

    export SSH_PRIVATE_KEY=$(cat ~/.ssh/id_rsa)
    

    然后在你的 compose 中使用它:

    services:
      jenkins:
        build: .
        volumes:
          - jenkins-data:/var/jenkins_home
        environment:
          - SSH_PRIVATE_KEY
        ports:
          - "8080:8080"
          - "50000:50000"
    

    它应该从 docs 中指定的 shell 环境中为容器获取环境变量的值:

    容器中变量的值取自运行 Compose 的 shell 中相同变量的值。

    【讨论】:

    • 我在徘徊如何使用容器中的这个SSH_PRIVATE_KEY值作为私钥?
    • @Adiii 使用 jenkins Configuration as Code Plugin 从容器环境中获取私钥。
    • 啊,谢谢@michalk,我刚刚测试了它,并且有效!但是,我现在意识到,我的想法在构建图像时不会像我需要的那样起作用,而目前该值只是在之后才分配的。我将尝试将它作为构建 arg 传递,看看这是否对我有用
    • @Adiii 我没有使用那个插件作为容器,我试图在我的 Dockerfile 中创建一个多阶段构建,因为我担心我会泄露 SSH 密钥。
    【解决方案2】:

    可能的解决方案:

        environment:
          - SSH_PRIVATE_KEY
    

    并像这样调用 docker-compose:

    SSH_PRIVATE_KEY=$(cat ~/.ssh/id_rsa) docker-compose build
    

    很遗憾,目前无法在.env 中使用多行变量。

    另一种可能是:

    services:
      jenkins:
        build: .
        volumes:
          - jenkins-data:/var/jenkins_home
          - "/home/user/.ssh/id_rsa:/home/user/.ssh/id_rsa:ro"      
        ports:
          - "8080:8080"
          - "50000:50000"
    
    volumes:
      jenkins-data:
    

    【讨论】:

    • 它应该可以工作,但是您可以省略 ${SSH_PRIVATE_KEY},因为 docker-compose 可以从本地环境中选择具有相同名称的值(如我的回答所示)。无论如何+1。
    • 是的,我总是把它放在那里,因为我经常根据图像使用不同的变量名和默认值。在这种情况下我将其删除
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2015-06-17
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多