Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从docker中运行的jenkins生成/推送映像_Docker_Jenkins_Docker Registry - Fatal编程技术网

从docker中运行的jenkins生成/推送映像

从docker中运行的jenkins生成/推送映像,docker,jenkins,docker-registry,Docker,Jenkins,Docker Registry,我有两个docker容器——一个运行jenkins,一个运行docker注册表。我想从jenkins创建/推送图像到docker注册表。如何以简单安全的方式实现这一点(意味着没有黑客攻击)?最简单的方法是确保jenkins容器和registry容器位于同一主机上。然后,您可以将docker套接字装载到jenkins容器上,并使用主机上的docker将映像推送到注册表/var/run/docker.sock是dockerd正在侦听的unix套接字 通过安装docker套接字,从该容器运行的任何do

我有两个docker容器——一个运行jenkins,一个运行docker注册表。我想从jenkins创建/推送图像到docker注册表。如何以简单安全的方式实现这一点(意味着没有黑客攻击)?

最简单的方法是确保jenkins容器和registry容器位于同一主机上。然后,您可以将docker套接字装载到jenkins容器上,并使用主机上的docker将映像推送到注册表
/var/run/docker.sock
是dockerd正在侦听的unix套接字

通过安装docker套接字,从该容器运行的任何
docker
命令都会像主机一样执行

$ docker run -dti --name jenkins -v /var/run/docker.sock:/var/run/docker.sock jenkins:latest

我在Jenkins docker容器中使用这种工作流,好消息是它不需要任何黑客来完成。有些人使用“docker in docker”来实现这一点,但如果这是你想走的路线,我也帮不了你,因为我没有这样做的经验。这里我将概述如何使用现有的docker服务(运行jenkins容器的服务)进行构建

我将做一些假设,因为您没有指定设置的外观:

  • 您正在同一主机上运行两个容器
  • 您没有使用docker compose
  • 您没有运行docker swarm(或swarm模式)
  • 您正在Linux上使用docker
如果上述任何条件都不成立,可以很容易地对其进行修改,但我需要一个基线

您将需要以下内容:

  • 从Jenkins容器访问主机上运行的docker
  • 从Jenkins容器访问注册表容器
先决条件/设置

设置这一点非常简单。在让Jenkins访问主机上正在运行的docker服务的情况下,您可以通过以下两种方式之一进行访问。1) 通过TCP和2)通过docker unix套接字。如果您已经让docker监听TCP,您只需注意主机的IP地址和默认docker TCP端口号(2375或2376,取决于您是否使用TLS)以及您可能拥有的TLS配置

如果您不想启用docker TCP服务,它会稍微复杂一些,但是您可以使用UNIX套接字,地址为
/var/run/docker.sock
。这需要将套接字绑定到Jenkins容器。在运行jenkins时,您可以通过将以下内容添加到run命令来完成此操作:

-v/var/run/docker.sock:/var/run/docker.sock

您还需要在主机系统上创建一个jenkins用户,其UID与容器中的jenkins用户相同,然后将该用户添加到docker组

Jenkins

您现在需要一个Docker构建/发布插件,如或其他插件,具体取决于您的需要。您需要注意以下配置项:

  • Docker URI/URL将类似于
    tcp://:2375
    unix:///var/run/docker.sock
    取决于我们如何进行上述设置。如果对docker服务使用TCP和TLS,则需要将Jenkins实例的TLS客户端证书作为“docker主机证书身份验证”上载到Jenkins中的常用凭据部分
  • Docker注册表URL将是指向注册表容器的URL,而不是localhost。它可能类似于http://:32768或类似的内容,具体取决于您的配置。您还可以链接容器,但如果稍后将容器移动到单独的主机,则无法轻松扩展。您还需要在相应的凭据部分添加登录到注册表的凭据,作为用户名/密码对
我已经完成了这个精确的设置,因此我将为您提供一个“tl;dr”版本的它,因为这里深入的内容远远超出了StackOVerflow的范围:

  • 在容器中安装PID1处理程序文件(即
    tini
    )。你需要这个来处理信号和处理收割。这将是你的入口点
  • 安装一些过程控制服务(即
    supervisord
    )软件包。通常不建议在容器中运行多个服务,但在这种特殊情况下,您的选项非常有限
  • 安装Java/Jenkins软件包或从DockerHub映像创建映像
  • 添加一个dind(Docker中的Docker)包装脚本。是我配置的基础
  • 创建流程控制服务的配置,以启动Jenkins(作为Jenkins用户)和dind包装器(作为root用户)
  • 将jenkins用户添加到Dockerfile中的docker组
  • 使用
    --privileged
    标志运行docker容器(DinD需要它)
  • 你完了
      谢谢您的意见!我在做了一些实验后想出了这个

      
      docker run-d\
      -p 8080:8080\
      -p 50000:50000\
      --名字叫詹金斯\
      -v
      pwd
      /data/jenkins:/var/jenkins\u home\ -v/Users/...docker/machine/machines/docker:/Users/...docker/machine/machines/docker\ -e DOCKER\u TLS\u VERIFY=“1”\ -e DOCKER_主机=”tcp://192.168.99.100:2376" \ -e DOCKER_CERT_PATH=“/Users/...DOCKER/machine/machines/DOCKER”\ -e DOCKER\u MACHINE\u NAME=“DOCKER”\ johannesw/jenkins docker cli

      如果您使用管道,您可以安装此Docker插件, 在Jenkins上创建凭据资源,以访问Docker注册表,并在管道中执行此操作:

          stage("Build Docker image") {
              steps {
                  script {
                      docker_image = docker.build("myregistry/mynode:latest")
                  }
              }
          }
      
          stage("Push images") {
              steps {
                  script {
      
                      withDockerRegistry(credentialsId: 'registrycredentials', url: "https://myregistry") {
                          docker_image.push("latest")
                      }
                  }
              }
          }
      

      完整示例位于:

      此答案仅部分正确,因为它a)是一个安全漏洞,b)容器和主机上必须具有相同的docker版本。