【问题标题】:Docker secrets within a docker volumeDocker 卷中的 Docker 机密
【发布时间】:2019-05-20 15:47:51
【问题描述】:

我正在尝试设置一个基于 Docker 的 Jenkins 实例。本质上,我将jenkins/jenkins:lts 映像作为容器运行并挂载数据卷以保存 Jenkins 将创建的数据。

现在,我想做的是与这个 Jenkins 实例共享主机的 ssh 密钥。这可能是由于我对 Docker 的了解有限,但我的问题是我不知道如何将其他文件/目录挂载到我的卷中,而 Jenkins 要求我将 ssh 密钥放在 var/jenkins_home/.ssh 中。

我尝试天真地在 Dockerfile 中创建目录,然后使用 docker-compose 挂载它们。正如您所料,它失败了,因为 volume 是包含 Jenkins 主目录数据的那个,而不是 Jenkins 容器本身。

我有以下docker-compose.yml(由于上述原因无法正常工作):

version: '3.1'

services:
  jenkins:
    restart: always
    build: ./jenkins
    environment:
      VIRTUAL_HOST: ${NGINX_VIRTUAL_HOST}
      VIRTUAL_PORT: 8080
      JAVA_OPTS: -Djenkins.install.runSetupWizard=false
      TZ: America/New_York
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - jenkins_data:/var/jenkins_home
    networks:
      - web
      - proxy
    healthcheck:
      test: ["CMD", "curl --fail http://${NGINX_VIRTUAL_HOST}/ || exit 1"]
      interval: 1m
      timeout: 10s
      retries: 3
    secrets:
      - host_ssh_key

volumes:
  jenkins_data:

networks:
  web:
    driver: bridge
  proxy:
    external:
      name: nginx-proxy

secrets:
  host_ssh_key:
    file: ~/.ssh/id_rsa

我的问题是:我是否可以在我的数据量中获得这个秘密?

【问题讨论】:

    标签: docker jenkins docker-compose docker-volume


    【解决方案1】:

    我知道这是一个相当古老的线程,但很多人都陷入了这个困境,包括我在内,答案根本不正确。您确实可以在不使用 Swarm 的情况下通过 docker-compose 使用秘密,前提是它是本地计算机或秘密文件安装在主机上。并不是说这是安全的或可取的,只是说它可以做到。这个博客是对这几种方法的最佳解释之一;

    Using Docker Secrets during Development

    以下是用于向 Spring 应用程序添加 api 密钥的 docker compose 文件的部分示例。然后可以在 Docker 容器内的 /run/secrets/captcha-api-key 处获得该密钥。 Docker 通过将文件绑定为挂载来“伪造”它,然后可以以任何方式访问该挂载。它不安全,因为文件仍然存在,所有有权访问 /run/secrets 的人都可以看到它,但它绝对可以作为一种解决方法。非常适合开发服务器,但不会在生产中使用;

    version: '3.6'
    services:
      myapp:
        image: mmyapp
        restart: always
        secrets:
          - captcha-api-key
    
    secrets:
      captcha-api-key:
        file: ./captcha_api_key.txt
    

    编辑:除此之外,您可以简单地运行一个单节点集群,这只是在资源上稍微多一点,并按照预期的方式使用秘密。如果图像已经构建,“docker stack deploy mydocker-composefile.yml mystackname”将与旧的 docker compose 几乎相同。请注意,yml 文件必须以 3 或更高的规范编写。

    这是一篇关于 compose vs swarm 的简短而简洁的文章; The Difference Between Docker Compose And Docker Stack

    【讨论】:

      【解决方案2】:

      按照给定的方式安装秘密并尝试。

       secrets:
        - source: host_ssh_key
          target: /var/jenkins_home/.ssh/id_rsa
          mode:   0600
      

      【讨论】:

      • 不起作用。更多细节在这里:github.com/docker/compose/issues/4994。简而言之,似乎秘密根本无法与 docker-compose 一起正常工作,只有 docker swarm。如果你问我有点傻......哦,好吧。
      【解决方案3】:

      这是不可能的。 Secrets 仅适用于 docker swarm; docker-compose 无法使用机密。

      更多详情请见this GitHub issue

      【讨论】:

        猜你喜欢
        • 2016-03-10
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        相关资源
        最近更新 更多