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