2017-03-16 3 views
1

도커 이미지를 작성하는 Jenkins 컨테이너를 실행하려고합니다. 지난주 도커로 시작했는데 호스트의 볼륨 사용 및 사용자 처리 방법과 다소 혼동 스럽습니다.루트가 아닌 다른 사용자와 컨테이너에서 도커 데몬에 액세스하는 방법

나는 인터넷에서 검색을 해왔고 누군가 컨테이너에서 도커 데몬에 액세스 할 수있는 솔루션을 게시했음을 알게되었습니다. 기본적으로, 아이디어는 고정 표시기 bin 폴더와 같은 호스트에서 docker.sock를 포함하는 볼륨 젠킨스 컨테이너 내부에 마운드하는 것입니다

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

그 짓을했는지 그리고 내가 루트 해요 경우에만 작동하지만 . 내가 도커를 배우기 시작했을 때 나는 jenkins 이미지를 직접 사용하는 대신에 jenkins 이미지 자체와 종속성에서 Dockerfiles를 복사하여 프로세스를 설명하는 블로그의 예를 따랐습니다. 프로세스의 일부로 jenkins 사용자가 생성되며 컨테이너를 시작할 때 사용됩니다. 내 문제는 이제 jenkins 사용자가 docker.sock이 루트에 속해 있고 호스트의 그룹 docker에 대한 액세스 권한을 가질 수 없다는 것입니다. Dockerfile에 docker 사용자를 추가하려고 시도했지만 docker.sock에 액세스 할 때 Jenkins 작업에서 여전히 권한 거부 오류가 발생합니다. 컨테이너 안에 장착 된 /var/run/docker.sock을 검사하면 은 docker 대신 user 그룹에 속하므로 디렉토리가 마운트 될 때 어떤 일이 벌어지는 지 정확히 알 수 없습니다. 나는 리눅스에서 많은 일을하지 않았으므로 디렉토리가 마운트 될 때 사용자 docker이 존재하지 않는다고 추측한다. 따라서 기본값은 user이지만 완전히 틀릴 수도있다.

젠킨스 컨테이너로 사용할 컨테이너를 만들고 다른 곳에서 실행해야하는 컨테이너를 만들지 않으면 특정 jenkins 사용자를 만드는 목적은 무엇입니까? 내가 직접 사용자 root을 사용할 수없는 이유가 있습니까?

이것은 내가 사용하는 Dockerfile입니다. 감사.

FROM centos:7 

# Yum workaround to stalled mirror 
RUN sed -i -e 's/enabled=1/enabled=0/g' /etc/yum/pluginconf.d/fastestmirror.conf 

RUN rm -f /var/lib/rpm/__* 
RUN rpm --rebuilddb -v -v 
RUN yum clean all 


# see https://bugs.debian.org/775775 
# and https://github.com/docker-library/java/issues/19#issuecomment-70546872 
ENV CA_CERTIFICATES_JAVA_VERSION 20140324 

RUN yum -v install -y \ 
    wget \ 
    zip \ 
    which \ 
    openssh-client \ 
    unzip \ 
    java-1.8.0-openjdk-devel \ 
    git \ 
    && yum clean all 

#RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure 

# Install Tini 
ENV TINI_VERSION 0.9.0 
ENV TINI_SHA fa23d1e20732501c3bb8eeeca423c89ac80ed452 

# Use tini as subreaper in Docker container to adopt zombie processes 
RUN curl -fsSL https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-static -o /bin/tini && chmod +x /bin/tini \ 
    && echo "$TINI_SHA /bin/tini" | sha1sum -c - 

# SET Jenkins Environment Variables 
ENV JENKINS_HOME /var/jenkins_home 
ENV JENKINS_SLAVE_AGENT_PORT 50000 
ENV JENKINS_VERSION 2.22 
ENV JENKINS_SHA 5b89b6967e7af8119c52c7e86223b47665417a22 
ENV JENKINS_UC https://updates.jenkins-ci.org 
ENV COPY_REFERENCE_FILE_LOG $JENKINS_HOME/copy_reference_file.log 

# SET Java variables 
ENV JAVA_HOME /usr/lib/jvm/java/jre 
ENV PATH /usr/lib/jvm/java/bin:$PATH 

# 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 useradd -d "$JENKINS_HOME" -u 1000 -m -s /bin/bash jenkins 

#Not working. Folder not yet mounted? 
#RUN DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \ 

#Using gid from host 
RUN groupadd -for -g 50 docker && \ 
    usermod -aG docker jenkins 

# Jenkins home directory is a volume, so configuration and build history 
# can be persisted and survive image upgrades 
VOLUME /var/jenkins_home 

# `/usr/share/jenkins/ref/` contains all reference configuration we want 
# to set on a fresh new installation. Use it to bundle additional plugins 
# or config file with your custom jenkins Docker image. 
RUN mkdir -p /usr/share/jenkins/ref/init.groovy.d 

# Install Jenkins 
RUN curl -fL 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 \ 
    && echo "$JENKINS_SHA /usr/share/jenkins/jenkins.war" | sha1sum -c - 

ENV JAVA_OPTS="-Xmx8192m" 
ENV JENKINS_OPTS="--logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war" 

# Prep Jenkins Directories 
RUN chown -R jenkins "$JENKINS_HOME" /usr/share/jenkins/ref 
RUN mkdir /var/log/jenkins 
RUN mkdir /var/cache/jenkins 
RUN chown -R jenkins:jenkins /var/log/jenkins 
RUN chown -R jenkins:jenkins /var/cache/jenkins 

# Expose Ports for web and slave agents 
EXPOSE 8080 
EXPOSE 50000 

# Copy in local config files 
COPY init.groovy /usr/share/jenkins/ref/init.groovy.d/tcp-slave-agent-port.groovy 
COPY jenkins.sh /usr/local/bin/jenkins.sh 
COPY plugins.sh /usr/local/bin/plugins.sh 
RUN chmod +x /usr/local/bin/plugins.sh 
RUN chmod +x /usr/local/bin/jenkins.sh 


# Install default plugins 
COPY plugins.txt /tmp/plugins.txt 
RUN /usr/local/bin/plugins.sh /tmp/plugins.txt 


# Add ssh key 
RUN eval "$(ssh-agent -s)" 
RUN mkdir /usr/share/jenkins/ref/.ssh && \ 
    chmod 700 /usr/share/jenkins/ref/.ssh && \ 
    ssh-keyscan github.com > /usr/share/jenkins/ref/.ssh/known_hosts 

COPY id_rsa /usr/share/jenkins/ref/.ssh/id_rsa 
COPY id_rsa /usr/share/jenkins/ref/.ssh/id_rsa.pub 
COPY hudson.tasks.Maven.xml /usr/share/jenkins/ref/hudson.tasks.Maven.xml 

RUN chown -R jenkins:jenkins /usr/share/jenkins/ref && \ 
    chmod 600 /usr/share/jenkins/ref/.ssh/id_rsa && \ 
    chmod 600 /usr/share/jenkins/ref/.ssh/id_rsa.pub && \ 
    chmod 600 /usr/share/jenkins/ref/hudson.tasks.Maven.xml 

COPY id_rsa /root/.ssh/id_rsa 
COPY id_rsa /root/.ssh/id_rsa.pub 

# ssh keys for root. To use root as the user 
RUN chmod 600 /root/.ssh/id_rsa && \ 
    chmod 600 /root/.ssh/id_rsa.pub && \ 
    ssh-keyscan github.com > /root/.ssh/known_hosts 

# Switch to the jenkins user 
USER jenkins 

# Tini as the entry point to manage zombie processes 
ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"] 

답변

0

명백하게 문제는 gid에있었습니다. 웬일인지 나는 호스트의 그룹의 ducker gid가 50이었다라고 생각했다. 그러나 실제로 그것은 실제로 100이었다. 내가 100로 그것을 바꿨을 때, 젠킨스 직업은 일하기 시작했다. 아직도 docker.sock이 컨테이너에 docker 대신에 user 그룹에 속해있는 이유를 여전히 알지 못합니다. 나는 용기에 cat /etc/group을 할 경우 나는

root:x:0: 
... 
users:x:100: 
... 
jenkins:x:1000: 
docker:x:100:jenkins 

을 확인하고 호스트에

root:x:0: 
lp:x:7:lp 
nogroup:x:65534: 
staff:x:50:docker 
docker:x:100:docker 
dockremap:x:101:dockremap 
+0

외부 호스트와 컨테이너는 동일한 숫자 UID/GID를 사용하지만, 이름 (고정 표시기, 젠킨스 등) 다를 수 있습니다. 그 이유는 [namespaces] (https://en.wikipedia.org/wiki/Linux_namespaces)가 각 컨테이너에 사용자, PID, 파일 시스템 경로 등을위한 자체 네임 스페이스를 제공하기 때문입니다. –

관련 문제