Jenkins Pipeline не работает с docker-compose, потому что не может подключиться к демону docker - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать образ докера и запустить контейнер с docker-compose внутри конвейера Jenkins.

У меня есть собственный образ докера для моего Jenkins, где я использую образ Jenkins из коробки и устанавливаю Docker CE и docker compose.

Dockerfile:

FROM jenkins/jenkins:2.159

USER root

# create dir to save jenkins log files
RUN mkdir /var/log/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins

########################################################################################################################
## install docker based on: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-9
########################################################################################################################
RUN apt update
RUN apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
RUN apt update
# make sure you are about to install from the Docker repo instead of the default Debian repo
RUN apt-cache policy docker-ce
RUN apt -y install docker-ce
#RUN systemctl status docker

# give jenkins docker rights
RUN apt update
RUN apt-get install acl

#RUN ls /var/run
#RUN setfacl -m user:jenkins:rw /var/run/docker.sock

RUN usermod -aG docker jenkins
RUN gpasswd -a jenkins docker

################################################################################################################################
## install docker-compose based on: https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-debian-9
################################################################################################################################
RUN curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
RUN docker-compose --version

USER jenkins

RUN id -nG

#tell jenkins to use the created folder to store logs

Я создаю этот образ с docker-compose build с помощью этого файла docker-compose:

version: '3'

volumes:
  jenkins-log:
  jenkins-data:

networks:
  jenkins-net:

services:
  master:
    build: ./jenkins-master
    ports:
      - "50000:50000"
    volumes:
      - jenkins-log:/var/log/jenkins
      - jenkins-data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - jenkins-net

  nginx:
   build: ./jenkins-nginx
   ports:
      - "80:80"
   networks:
      - jenkins-net

И начните с docker-compose -p jenkins up -d

Это запускает Дженкинс и пока работает нормально.

Затем я создаю конвейерное задание, которое использует следующий файл Jenkinsfile:

node {
    stage('Build Docker Image') {
        sh '''
            cd env-ci/
            docker-compose --version
            docker --version
            docker-compose build
        '''
    }
}

Когда я запускаю этот конвейер, я получаю следующую ошибку:

+ cd env-ci/
+ docker-compose --version
docker-compose version 1.22.0, build f46880fe
+ docker --version
Docker version 18.09.1, build 4c52b90
+ docker-compose build
Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Когда я пытаюсь запустить docker info в конвейере:

node {
    stage('Build Docker Image') {
        sh '''
            cd env-ci/
            docker-compose --version
            docker --version
            docker info
        '''
    }
}

Я получаю следующую ошибку:

+ cd env-ci/
+ docker-compose --version
docker-compose version 1.22.0, build f46880fe
+ docker --version
Docker version 18.09.1, build 4c52b90
+ docker info
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/info: dial unix /var/run/docker.sock: connect: permission denied

В настоящее время у меня нет идей, что это за проблема или как я могу ее решить. Конвейер Jenkins запускается от имени пользователя jenkins, и этот пользователь добавляется в группу Docker. Таким образом, разрешение должно быть в порядке?!

У кого-нибудь есть идеи, что может быть не так? Спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Вероятно, существует проблема с разрешениями, так как это докер в докере. Я мог бы решить это с помощью следующего:

1) из хост-системы: подключитесь к работающему контейнеру jenkins от имени root

docker exec -u root -it <containerid> bin/bash

2) предоставьте пользователю jenkins право на /var/run/docker.sock

chown jenkins:docker /var/run/docker.sock

Теперь я могу успешно запустить конвейер с Jenkinsfile. Но это на самом деле не решает проблему, поскольку шаг chown необходимо выполнять после каждой сборки образа.

Изменить: Чистым решением для решения этой проблемы является использование подчиненного Jenkins (рабочий) с прокси Docker. Это описано в этой статье https://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container

...