从在docker中运行的jenkins构建/推送图像

时间:2017-03-17 17:41:19

标签: docker jenkins docker-registry

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

5 个答案:

答案 0 :(得分:0)

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

通过安装docker socket,从该容器运行的任何docker命令就像它是主机一样执行。

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

答案 1 :(得分:0)

如果您使用管道,则可以安装此Docker插件https://plugins.jenkins.io/docker-workflow, 在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")
                }
            }
        }
    }

完整示例,位于:https://pillsfromtheweb.blogspot.com/2020/06/build-and-push-docker-images-with.html

答案 2 :(得分:-1)

我在Jenkins docker容器中使用这种类型的工作流,好消息是它不需要任何hackery来完成。有些人在docker"中使用#14; docker要做到这一点,但如果这是你想要去的路线我无法帮助你,因为我没有经验这样做。我将在这里概述如何使用现有的docker服务(运行jenkins容器的服务)来进行构建。

我会做一些假设,因为你没有指定你的设置是什么样的:

  • 您在同一主机上运行两个容器
  • 您没有使用docker-compose
  • 您没有运行docker swarm(或swarm模式)
  • 您在Linux上使用docker

如果上述任何条件都不成立,可以轻松修改,但我需要一个基线来开始。

您需要以下内容:

  • 从Jenkins容器访问主机上运行的docker
  • 从Jenkins容器访问注册表容器

<强>先决条件/设置

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

如果您不想启用docker TCP服务,它会涉及更多,但您可以在/var/run/docker.sock使用UNIX套接字。这需要您将套接字绑定到Jenkins容器。您可以通过在运行jenkins时将以下内容添加到运行命令来执行此操作:

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

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

<强>詹金斯

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

  • Docker URI / URL将类似于tcp://<HOST_IP>:2375unix:///var/run/docker.sock,具体取决于我们如何进行上述设置。如果您使用TCP和TLS作为docker服务,则需要上传Jenkins实例的TLS客户端证书作为&#34; Docker主机证书身份验证&#34;到Jenkins的通常证件部分。
  • Docker Registry URL将是注册表容器的URL,而不是localhost。它可能类似http://<HOST_IP>:32768或类似,具体取决于您的配置。您也可以链接容器,但如果稍后将容器移动到单独的主机,则不容易扩展。您还需要在相应的凭据部分中添加用于登录到注册表的凭据作为用户名/密码对。

答案 3 :(得分:-1)

我已经完成了这个确切的设置,所以我会给你一个“tl; dr”版本,因为深入到这里是远远超出了StackOVerflow的范围:

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

答案 4 :(得分:-1)

感谢您的投入!经过一些实验,我想出了这个。

docker run -d \ -p 8080:8080 \ -p 50000:50000 \ --name jenkins \ -v pwd/data/jenkins:/var/jenkins_home \ -v /Users/.../.docker/machine/machines/docker:/Users/.../.docker/machine/machines/docker \ -e DOCKER_TLS_VERIFY="1" \ -e DOCKER_HOST="tcp://192.168.99.100:2376" \ -e DOCKER_CERT_PATH="/Users/.../.docker/machine/machines/docker" \ -e DOCKER_MACHINE_NAME="docker" \ johannesw/jenkins-docker-cli

相关问题