2016-08-04 141 views
1

我嘗試在CentOS7.1上的Jenkins slave容器中運行Docker。 這是我在dockerfile執行的步驟:+ A組泊塢窗(gid983)在Centos7上運行docker與jenkins容器內的jenkins用戶

FROM java:8 
ARG user=jenkins 
ARG group=jenkins 
ARG uid=1000 
ARG gid=1000 
RUN groupadd -g ${gid} ${group} \ 
&& useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user} 
RUN groupadd -g 983 docker \ 
&& gpasswd -a ${user} docker 

所以我有一組詹金斯(gid1000)用戶詹金斯(ID1000)。我爲什麼選擇gid 983? 那麼,如果我在我的主機檢查/etc/group我看到:

docker:x:983:centos 

在我的碼頭工人,撰寫劇本,我安裝我的搬運工插座所以這就是爲什麼我用同樣的GID作爲我的主機上。

泊塢窗,撰寫的部分:

volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
    - /usr/bin/docker:/usr/bin/docker 

當我exec我的容器內爲根:

[email protected]:/var/jenkins_home# docker images 
REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 
jenkins-slave  1.0     94a5d6606f86  10 minutes 
jenkins    2.7.1    b4974ba62598  3 weeks ago   741 MB 
java    8-jdk    264282a59a95  7 weeks ago   669.2 MB 

但由於詹金斯用戶:

Cannot connect to the Docker daemon. Is the docker daemon running on this host? 

在我的容器:

cat /etc/passwd 
jenkins:x:1000:1000::/var/jenkins_home:/bin/bash 

cat /etc/group 
jenkins:x:1000: 
docker:x:983:jenkins 

增加:

$ docker exec -it ec52d4125a02 bash 
[email protected]:/var/jenkins_home# whoami 
root 
[email protected]:/var/jenkins_home# su jenkins 
[email protected]:~$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS                  NAMES 
a23521523249  jenkins:2.7.1  "/bin/tini -- /usr/lo" 20 minutes ago  Up 20 minutes  0.0.0.0:8080->8080/tcp, 0.0.0.0:32777->22/tcp, 0.0.0.0:32776->50000/tcp jenkins-master 
ec52d4125a02  jenkins-slave:1.0 "setup-sshd"    20 minutes ago  Up 20 minutes  0.0.0.0:32775->22/tcp, 0.0.0.0:32774->8080/tcp, 0.0.0.0:32773->50000/tcp jenkins-slave 

但:

$ docker exec -it -u jenkins ec52d4125a02 bash 
[email protected]:~$ docker ps 
Cannot connect to the Docker daemon. Is the docker daemon running on this host? 

在第一種情況下,我的詹金斯用戶:

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),983(docker) 

在第二種情況:

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins) 
+0

你'嗯挑選幾個關鍵部分以便能夠重現您的問題。特別是Dockerfile中的'FROM'行。我已經做了類似的主要區別,我的Jenkins圖像做了Docker的安裝,而不是掛載可執行文件,我的命令是基於debian的。您的容器內是否定義了「$ DOCKER_HOST」變量? – BMitch

+0

變量未定義。我實際上嘗試使用docker作爲jenkinsuser在我用docker創建的jenkins-slave中。它只是一個具有java和SSH訪問權限的容器,它具有jenkins-user +組和裝載的docker卷。它並不包含dockerfile中的jenkins(它來自主設備)。我已經添加了我的FROM +我不使用該變量。 – lvthillo

+0

@BMitch我還添加了一個我的問題。 – lvthillo

回答

0

首先,您爲什麼需要從Jenkins的另一個容器中取出容器?這裏的why這不是一個好主意。

說了這些,你仍然想繼續前進。首先,你需要在Docker容器中運行Docker。例如,您是否在--priviledged模式下啓動了此容器?

你應該嘗試使用Jerome Petazzoni的Docker in Docker,因爲它的確如everything you need

然後,您可以將DInD的東西與Jenkins安裝結合起來。下面是我通過混搭傑羅姆的其他事情DIND和組裝方式,其詹金斯,泊塢窗撰寫和其他有用的東西泊塢窗容器放在一起的例子:

Dockerfile:

FROM ubuntu:xenial 
ENV UBUNTU_FLAVOR xenial 

#== Ubuntu flavors - common 
RUN echo "deb http://archive.ubuntu.com/ubuntu ${UBUNTU_FLAVOR} main universe\n" > /etc/apt/sources.list \ 
    && echo "deb http://archive.ubuntu.com/ubuntu ${UBUNTU_FLAVOR}-updates main universe\n" >> /etc/apt/sources.list 

MAINTAINER Rogério Peixoto 

ENV JENKINS_HOME /var/jenkins_home 
ENV JENKINS_SLAVE_AGENT_PORT 50000 

ARG user=jenkins 
ARG group=jenkins 
ARG uid=1000 
ARG gid=1000 

# Jenkins is run with user `jenkins`, uid = 1000 
# If you bind mount a volume from the host or a data container, 
# ensure you use the same uid 
RUN groupadd -g ${gid} ${group} \ 
&& useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user} 

# useful stuff. 
RUN apt-get update -q && apt-get install -qy \ 
    apt-transport-https \ 
    ca-certificates \ 
    curl \ 
    lxc \ 
    supervisor \ 
    zip \ 
    git \ 
    iptables \ 
    locales \ 
    nano \ 
    make \ 
    openssh-client \ 
    openjdk-8-jdk-headless \ 
    && rm -rf /var/lib/apt/lists/* 

# Install Docker from Docker Inc. repositories. 
RUN curl -sSL https://get.docker.com/ | sh 

# Install the wrapper script from https://raw.githubusercontent.com/docker/docker/master/hack/dind. 
ADD ./wrapdocker /usr/local/bin/wrapdocker 
RUN chmod +x /usr/local/bin/wrapdocker 

# Define additional metadata for our image. 
VOLUME /var/lib/docker 

ENV JENKINS_VERSION 2.8 
ENV JENKINS_SHA 4d83a40319ecf4eaab2344a18c197bd693080530 

RUN mkdir -p /usr/share/jenkins/ \ 
    && curl -SL http://repo.jenkins-ci.org/public/org/jenkins-ci/main/jenkins-war/${JENKINS_VERSION}/jenkins-war-${JENKINS_VERSION}.war -o /usr/share/jenkins/jenkins.war 
# RUN echo "$JENKINS_SHA /usr/share/jenkins/jenkins.war" | sha1sum -c - 

ENV JENKINS_UC https://updates.jenkins.io 
RUN mkdir -p /usr/share/jenkins/ref \ 
    && chown -R ${user} "$JENKINS_HOME" /usr/share/jenkins/ref 

RUN usermod -a -G docker jenkins 
ENV DOCKER_COMPOSE_VERSION 1.8.0-rc1 

# Install Docker Compose 
RUN curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
RUN chmod +x /usr/local/bin/docker-compose 

RUN apt-get install -y python-pip && pip install supervisor-stdout 

EXPOSE 8080 
EXPOSE 50000 

ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf 
CMD ["/usr/bin/supervisord"] 

supervisord 。CONF

[supervisord] 
nodaemon=true 

[program:docker] 
priority=10 
command=wrapdocker 
startsecs=0 
exitcodes=0,1 

[program:chown] 
priority=20 
command=chown -R jenkins:jenkins /var/jenkins_home 
startsecs=0 

[program:jenkins] 
priority=30 
user=jenkins 
environment=JENKINS_HOME="/var/jenkins_home",HOME="/var/jenkins_home",USER="jenkins" 
command=java -jar /usr/share/jenkins/jenkins.war 
stdout_events_enabled = true 
stderr_events_enabled = true 

[eventlistener:stdout] 
command=supervisor_stdout 
buffer_size=100 
events=PROCESS_LOG 
result_handler=supervisor_stdout:event_handler 

你可以得到wrapdocker file here

把所有在同一個目錄中並構建它:

docker build -t my_dind_jenkins .

然後運行它:

docker run -d --privileged \ 
    --name=master-jenkins \ 
    -p 8080:8080 \ 
    -p 50000:50000 my_dind_jenkins 
+0

目前尚不清楚OP是否在執行DinD,從docker.sock的掛載,我懷疑他們正在按照鏈接的「爲什麼你不應該做DinD」文章的解決方案部分。 – BMitch

相關問題