2016-08-04 11 views
1

Ich versuche, Docker in meinem Jenkins-Slave-Container auf Centos7.1 zu betreiben. Dies sind die Schritte, die ich in meinem dockerfile ausgeführt:Run Docker mit Jenkins Benutzer in Jenkins Container auf Centos7

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 

So habe ich einen Benutzer jenkins (ID1000) in einer Gruppe jenkins (gid1000) + in einer Gruppe Docker (gid983). Warum habe ich GID 983 gewählt? Nun, wenn ich /etc/group auf meinem Host prüfe ich sehen:

docker:x:983:centos 

In meinem Docker-compose Skript ich meine Docker Buchse Montage ist also, warum ich das gleiche gid wie auf meinem Host verwendet.

Teil von Docker-compose:

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

Wenn ich exec in meinem Container als root:

[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 

Aber als Benutzer jenkins:

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

In meinem Behälter:

012.349.

Zusatz:

$ 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 

aber:

$ 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? 

Im ersten Fall meines jenkins Benutzer:

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

Im zweiten Fall:

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

Sie bin mi Mehrere wichtige Teile benötigt, um Ihr Problem neu erstellen zu können. Insbesondere die 'FROM'-Zeile in Ihrer Dockerfile. Ich habe etwas Ähnliches mit den Hauptunterschieden gemacht, dass mein Jenkins-Image eine Installation von Docker ausführt, anstatt die ausführbare Datei zu mounten, und meine Befehle sind debian-basiert. Ist Ihre '$ DOCKER_HOST'-Variable in Ihrem Container definiert? – BMitch

+0

Die Variable ist nicht definiert. Ich versuche tatsächlich, docker als jenkinsuser in einem jenkins-slave zu verwenden, den ich mit docker komponiere. Es ist nur ein Container mit Java und SSH-Zugang, der eine jenkins-user + group und mounted docker volumes hat. Es enthält nicht wirklich jenkins in der dockerfile (es kommt vom Master). Ich habe meine FROM hinzugefügt + Ich verwende diese Variable nicht. – lvthillo

+0

@BMitch Ich habe auch einen Zusatz zu meiner Frage hinzugefügt. – lvthillo

Antwort

0

Erstens, warum müssen Sie mit Jenkins Container aus einem anderen drehen? Hier ist why das ist keine gute Idee.

Haben Sie das gesagt und Sie wollen weitermachen. Als erstes müssen Sie mehrere Schritte ausführen, um Docker in einem Docker-Container auszuführen. Haben Sie zum Beispiel diesen Container im --priviledged Modus gestartet?

Sie sollten versuchen, Jerome Petazzoni Docker in Docker verwenden, wie es everything you need tut.

Sie können dann DInDs Zeug mit einer Jenkins-Installation kombinieren. Hier ist ein Beispiel, das ich von Maischen bis Hieronymus Dind mit anderen Dingen zusammen haben und einen Docker Behälter zusammenbauen, die Jenkins, Dockarbeiter Compose und andere nützliche Dinge hat:

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 

können Sie erhaltenwrapdocker file here

alles, was im selben Verzeichnis und bauen es:

docker build -t my_dind_jenkins .

es dann laufen:

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

Es ist nicht klar, dass das OP DinD tut, von der Halterung des docker.sock, ich vermute, sie folgen dem Lösungsabschnitt von Ihrem verknüpften "Warum sollten Sie DinD nicht tun" -Artikel. – BMitch