docker 个卷中的 Docker 个秘密

Docker secrets within a docker volume

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

现在,我想做的是与这个 Jenkins 实例共享主机的 ssh 密钥。这可能是由于我的 Docker 知识有限,但我的问题是我不知道如何将额外的 files/directories 挂载到我的卷中,而 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

我的问题是:无论如何我可以在我的数据量中得到这个秘密吗?

像给定的那样安装秘密并尝试。

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

做不到。 Secrets 仅适用于 docker swarm; docker-compose 无法使用机密。

this GitHub issue 中有更多详细信息。

我知道这是一个相当古老的话题,但包括我在内的很多人都被困在这个问题上,答案根本不是真的。如果 Swarm 是本地机器或 secrets 文件安装在主机上,您确实可以将 secrets 与 docker-compose 一起使用,而无需使用 Swarm。并不是说这是安全的或可取的,只是说它可以做到。这个博客是对这几种可能方式的最佳解释之一;

Using Docker Secrets during Development

下面是用于向 Spring 应用程序添加 api 密钥的 docker 撰写文件的部分示例。然后可以在 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 与 swarm 的简短而简明的文章; The Difference Between Docker Compose And Docker Stack