夜猫的小站

在docker容器中的jenkins使用宿主机的docker脚本命令

Published on
阅读时间:3分钟593

本文最近一次更新于 1729 个天前,其中的内容很可能已经有所发展或是发生改变。

前言

起因是我的群晖机子上用docker安装了jenkins想要做自动化部署,但是我要部署的软件也是使用docker的,也就是要构建的软件位于jenkins所在的容器中,构建好无法直接发布到群晖的docker中。 在容器中的jenkins想要调用宿主机的docker,docker outside of docker这种方案是用的最多的,具体就是将宿主机的docker挂载到容器中,容器调用内部docker其实就是在调用宿主机的docker。

由于直接使用官方的jenkins库构建的容器并不符合,所以我查阅资料写了下Dockerfile。如下

Dockerfile

FROM jenkins/jenkins:lts
LABEL LY waterservers@163.com

USER root
# 换成网易源的debian 官方源太慢
RUN echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib" > /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list  && \
    echo "deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/debian/ stretch main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list && \
    echo "deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list

RUN apt-get update \
    && apt-get install -y sudo \
    && rm -rf /var/lib/apt/lists/*

RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins

将jenkins账号加入到sudo账号中,这样在jenkins账号就有权限去使用docker的命令了。不过这时候使用的docker方法都要加上sudo。

构建容器有两种

我使用的是docker-compose构建的

第一种 使用docker-compose

version: '3'
services:
  jenkins:
    build: .
    ports:
      - "32774:8080"
      - "50000:50000"
    networks:
      - default 
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock 
        - /usr/local/bin/docker:/usr/bin/docker
        - /volume2/docker/jenkins_home:/var/jenkins_home
        - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose

最重点的是 1、2两行。第一行是获取docker运行时,第二个是获取当前宿主机的docker方法。我的docker是安装在群晖的docker所以位于/usr/local/bin/docker中。其他系统可以使用which docker获取docker安装位置。

第二种 常规的使用命令行安装

docker run -p 8081:8080 --name jenkins --restart=always -it -d -u root -v /volume2/docker/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v  /usr/local/bin/docker:/bin/docker -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose jenkins