在Docker中设置Jenkins并使用Jenkins进行Docker最佳实践

4
我正在开发一个应用程序,希望使用Jenkins进行持续集成,并且我想要控制CI的环境。我在OS X上进行本地开发,并将其推送到远程Ubuntu 16.04 VM。所有这些都导致了Docker的出现。基本上,我想要的是Jenkins-in-Docker,但也需要Docker-in-Jenkins。我的构建slave(s)最初将仅限于master。
现在,我已经阅读了过去几天关于Docker的一些文章,但我仍然不完全确定我是否深入理解它。因此,提出这个问题。
目前,这是我的设置:
Jenkins: /docker-compose.yml
version: '3'
services:
  jenkins:
    build: ./jenkins
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # allowing docker-in-docker
      - ./jenkins_home:/var/jenkins_home
    ports:
      - 8080:8080

/jenkins/Dockerfile

FROM docker:17.12 AS docker
FROM jenkins/jenkins:lts

COPY --from=docker /usr/local/bin/docker /usr/local/bin/docker

上述设置很好用——直到我在Jenkins中使用Docker。虽然已经安装了Jenkins,但是当我构建任何需要使用Docker的作业时,会出现以下错误:

试图连接unix:///var/run/docker.sock的Docker守护进程套接字时,遇到权限被拒绝的问题:Post (...) dial unix /var/run/docker.sock: connect: permission denied

CI源代码: /Jenkinsfile
pipeline {
  agent { dockerfile true }
  stages {
    stage('Initial') {
      steps {
        println 'Hello world!'
      }
    }
  }
}

/Dockerfile

FROM python:3.6-slim-jessie
COPY requirements.txt ./
RUN pip install -r requirements.txt --no-cache-dir
CMD ["python"]

现在是问题时间!

首先,很显然我缺少一些权限来让容器使用我的主机Docker守护进程。我看到这篇文章(还有其他文章)提供了一些解决方案。

其次,这甚至是设置事物的预期方式吗?我想学习正确的Docker使用方法,不知道我是否遗漏了多阶段构建等方面的内容?


1
Jenkins插件和执行做出了关于设置的假设,这可能会使使用现有插件尝试向这种设置移动变得困难。 可能加速此过程的几种方法:(1)查看执行的Jenkins docker命令。 Jenkins正在控制Docker执行,你可能会对发现的内容感到惊讶。(2) 尝试绘制每个容器的容器、卷挂载、用户和组的图像(我以前做过,觉得很有帮助)(3)先在本地搞定。 首先在Jenkins上学习这个东西是我称之为“艰难的方法”。 - mkobit
所以,对于“Got permission denied” - 我的第一个猜测是,即使Docker客户端可以与套接字通信,它也没有正确的用户/组来使用。如果您尝试将一个由“root”拥有的文件挂载到您的工作区并尝试读取它,您可能会看到类似的错误。我建议在代理上运行“stat -c%g /var/run/docker.sock”以查看Docker套接字的所有组,并添加“args'--group-add = that-group-id'”(来自[docs](https://docs.docker.com/engine/reference/commandline/run)),看看是否能让您更进一步。 - mkobit
3
你是否阅读了Docker推荐的有关此事的博客文章:https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/?请注意该文章末尾关于在最近版本的Docker中复制Docker二进制可执行文件的警告。你应该从Jenkins Dockerfile的最后一行中删除它。 - Matt Schuchard
2个回答

2
请检查此 Dockerfile 用于在 docker 中运行 jenkins。
FROM jenkins/jenkins:lts
MAINTAINER "artem@aleksashkin.com" Artem Aleksashkin

USER root
RUN apt-get update && \
    apt-get -y install apt-transport-https \
         ca-certificates \
         curl \
         gnupg2 \
         software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
       $(lsb_release -cs) \
       stable" && \
    apt-get update && \
    apt-get -y install docker-ce && \
    rm -rf /var/lib/apt/lists/* && \
    curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
    chmod +x /usr/local/bin/docker-compose && \
    usermod -aG docker jenkins

USER jenkins

不错的代码片段。让我的生活变得更加轻松。您能否在安装docker时添加openssh-server?如果有人想要将jenkins用作从节点并进行调试,则需要ssh。 - harshavmb

0
请使用以下 Dockerfile:
FROM jenkins/jenkins

USER root

RUN apt-get update RUN apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common RUN curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - RUN add-apt-repository \    "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \   $(lsb_release -cs) \    stable" RUN apt-get update RUN apt-get -y install docker-ce

USER jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接