2017-03-16 7 views
1

ドッカーイメージを作成するJenkinsコンテナを実行しようとしています。私は先週ドッカーで始めました。ホストからのボリュームの使い方やユーザーの扱い方など、ちょっと混乱しています。root以外のユーザーとコンテナからドッカーデーモンにアクセスするには

私はインターネットで検索していますが、誰かがコンテナからドッカーデーモンにアクセスできるように解決策を投稿しているというgit問題を発見しました。基本的には、アイデアはジェンキンス容器内マウンドには、このようなホストからのドッキングウィンドウbinフォルダとdocker.sockを含むボリュームです:

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

私はそれをやったし、それが動作しますが、私はルートだ場合にのみ、 。ドッカーを学び始めたとき、ジェンキンス画像を直接使うのではなく、ジェンキン画像とその依存関係からDockerfilesをコピーしてプロセスを説明するブログの例に従った。このプロセスの一環として、jenkinsユーザーが作成され、これはコンテナを起動するときに使用されます。今私の問題は、jenkinsユーザーがdocker.sockがrootに属しており、ホストのグループdockerにアクセスできるようにすることができないということです。 Dockerfileにdockerというユーザーを追加しようとしましたが、docker.sockにアクセスすると、Jenkinsのジョブからのアクセス許可が拒否されました。コンテナ内に実装されている/var/run/docker.sockを調べると、docker.sockdockerの代わりにuserのグループに属しているので、ディレクトリがマウントされているときに何が起こっているのか正確には分かりません。私は多くのLinuxで働いていないので、ユーザdockerはディレクトリがマウントされたときに存在せず、デフォルトのuserを使用していると思われますが、おそらく完全に間違っている可能性があります。

私がまだ得意でないもう1つのことは、Jenkinsコンテナとして使用するコンテナを作成してそこで実行されるはずのものがない場合、特定のjenkinsユーザーを作成する目的は何ですか?ユーザーが直接使用できない理由はありますかroot

これは私が使用するドッカーファイルです。ありがとう。

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にありました。何らかの理由で私はホストのグループのドッカー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のを使用していますが、名前(ドッキングウィンドウ、ジェンキンス、など)異なる可能性があります。これは、各コンテナーにユーザー、PID、ファイルシステムのパスなどのための独自の名前空間を与える[namespaces](https://en.wikipedia.org/wiki/Linux_namespaces)が原因です。 –

関連する問題