【问题标题】:Best-practice of setting up Jenkins-in-Docker with Docker-in-Jenkins使用 Docker-in-Jenkins 设置 Jenkins-in-Docker 的最佳实践
【发布时间】:2018-03-24 16:59:30
【问题描述】:

我正在开发一个应用程序,我希望使用 Jenkins 进行持续集成,此外我希望能够控制 CI 环境。我正在 OS X 上进行本地开发,并且正在推送到远程 Ubuntu 16.04 VM。 所有这些都将我引向了 Docker。 基本上我想要的是 Jenkins-in-Docker,但也需要 Docker-in-Jenkins。我的 build slave(s) 最初将仅限于 master

现在,过去几天我一直在阅读一些关于 Docker 的帖子,但我仍然不能完全确定我是否深入了解它。因此提出了这个问题。

目前,这是我的设置:

詹金斯:

/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

上面的设置工作得很好——直到我使用 Docker-in-Jenkins。 Jenkins 已安装完毕,但是当我构建任何将 使用 Docker 的作业时,我收到一个错误,即

在尝试连接到 Docker 守护程序时获得权限被拒绝 unix:///var/run/docker.sock 处的套接字:发布 (...) 拨号 unix /var/run/docker.sock: 连接:权限被拒绝

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 守护程序的权限。我看到this post(以及其他人)对此有一些答案。

其次,这甚至是预期的设置方式吗?我想以正确的方式学习 docker,我不知道我是否遗漏了一些关于例如多阶段构建?

【问题讨论】:

  • Jenkins 插件和执行对事物的设置方式进行了假设,这使得尝试使用现有插件进行这样的设置变得困难。几种可能加快速度的方法(1)查看执行的 Jenkins docker 命令。 Jenkins 正在控制 Docker 执行你可能会对你的发现感到惊讶 (2) 尝试绘制每个容器的容器、卷挂载、用户和组的图片(我以前做过,发现它对个人很有帮助)(3)先在本地搞清楚。首先在 Jenkins 上学习这就是我所说的“艰难的方式”。
  • 所以,对于Got permission denied - 我的第一个猜测是,即使 Docker 客户端可以与套接字通信,它也没有正确的用户/组可以使用。如果您尝试将root 拥有的文件安装到您的工作区并尝试读取它,您可能会看到类似的错误。我建议在代理上运行 stat -c %g /var/run/docker.sock 以查看 Docker 套接字的所属组是什么,然后添加 args '--group-add=that-group-id'(来自 docs),看看这是否能让你更进一步。
  • 你是否阅读过Docker推荐的博客文章:jpetazzo.github.io/2015/09/03/…?请注意最后关于在最新版本的 Docker 中复制 Docker 二进制可执行文件的警告。您可能应该从 Jenkins Dockerfile 的最后一行中删除它。

标签: docker jenkins dockerfile jenkins-pipeline


【解决方案1】:

请使用 docker 检查此 Dockerfile 中的 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

【讨论】:

  • 不错的sn-p。让我的生活变得轻松。您能否添加 openssh-server 与 docker 一起安装?如果有人想将 jenkins 用作奴隶并进行调试,则需要 ssh。
【解决方案2】:

使用这个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多