[英]Run Docker as jenkins-agent, in a docker-container, as non-root user
[英]unable to run docker as non-root user?
我已經試過這篇文章 ,但沒有幫助。
我已經創建了jenkins
用戶並將其添加到jenkins
組。
我也已經在dockerFile中切換了用戶(見下文)。
我如下啟動容器
docker run -u jenkins -d -t -p 8080:8080 -v /var/jenkins:/jenkins -P docker-registry:5000/bar/helloworld:001
容器啟動正常。 但是當我看這個過程時,這就是我所擁有的
root 13575 1 1 09:34 ? 00:05:56 /usr/bin/docker daemon -H fd://
root 28409 13575 0 16:13 ? 00:00:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 8080
第一個是守護程序。 所以我想成為根是可以的。 但是第二個(我通過發出sudo su jenkins
切換到jenkins用戶)顯示root
。 我以jenkins用戶身份啟動了docker。 為什么這個過程屬於根?
這是我的dockerfile
#copy jenkins war file to the container
ADD http://mirrors.jenkins-ci.org/war/1.643/jenkins.war /opt/jenkins.war
RUN chmod 644 /opt/jenkins.war
ENV JENKINS_HOME /jenkins
RUN useradd -d /home/jenkins -m -s /bin/bash jenkins
USER jenkins
ENV HOME /home/jenkins
WORKDIR /home/jenkins
# Maven settings
RUN mkdir .m2
ADD settings.xml .m2/settings.xml
ENTRYPOINT ["java", "-jar", "/opt/jenkins.war"]
EXPOSE 8080
CMD [""]
我確定容器正在運行。 我可以貼在容器上。 我還可以瀏覽jenkins的web-ui,這只有在容器啟動時沒有錯誤的情況下才有可能(jenkins在容器內運行)
這是我在容器內的命令
ps -ef | grep java
jenkins 1 0 7 19:29 ? 00:00:28 java -jar /opt/jenkins.war
ls -l /jenkins
drwxr-xr-x 2 jenkins jenkins 4096 Jan 11 18:54 jobs
但是從主機文件系統中,我看到新創建的“ jobs”目錄顯示為用戶“ admin”
ls -l /var/jenkins/
drwxr-xr-x 2 admin admin 4096 Jan 11 10:54 jobs
在容器內部,“ jenkins”用戶啟動了jenkins進程(戰爭)。 jenkins啟動后,它將以“ admin”用戶身份寫入主機文件系統。
這是我的整個dockerFile(注意:我不使用這里的一個)
FROM centos:7
RUN yum install -y sudo
RUN yum install -y -q unzip
RUN yum install -y -q telnet
RUN yum install -y -q wget
RUN yum install -y -q git
ENV mvn_version 3.2.2
# get maven
RUN wget --no-verbose -O /tmp/apache-maven-$mvn_version.tar.gz http://archive.apache.org/dist/maven/maven-3/$mvn_version/binaries/apache-maven-$mvn_version-bin.tar.gz
# verify checksum
RUN echo "87e5cc81bc4ab9b83986b3e77e6b3095 /tmp/apache-maven-$mvn_version.tar.gz" | md5sum -c
# install maven
RUN tar xzf /tmp/apache-maven-$mvn_version.tar.gz -C /opt/
RUN ln -s /opt/apache-maven-$mvn_version /opt/maven
RUN ln -s /opt/maven/bin/mvn /usr/local/bin
RUN rm -f /tmp/apache-maven-$mvn_version.tar.gz
ENV MAVEN_HOME /opt/maven
# set shell variables for java installation
ENV java_version 1.8.0_11
ENV filename jdk-8u11-linux-x64.tar.gz
ENV downloadlink http://download.oracle.com/otn-pub/java/jdk/8u11-b12/$filename
# download java, accepting the license agreement
RUN wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -O /tmp/$filename $downloadlink
# unpack java
RUN mkdir /opt/java-oracle && tar -zxf /tmp/$filename -C /opt/java-oracle/
ENV JAVA_HOME /opt/java-oracle/jdk$java_version
ENV PATH $JAVA_HOME/bin:$PATH
# configure symbolic links for the java and javac executables
RUN update-alternatives --install /usr/bin/java java $JAVA_HOME/bin/java 20000 && update-alternatives --install /usr/bin/javac javac $JAVA_HOME/bin/javac 20000
# copy jenkins war file to the container
ADD http://mirrors.jenkins-ci.org/war/1.643/jenkins.war /opt/jenkins.war
RUN chmod 644 /opt/jenkins.war
ENV JENKINS_HOME /jenkins
#RUN useradd jenkins
#RUN chown -R jenkins:jenkins /home/jenkins
#RUN chmod -R 700 /home/jenkins
#USER jenkins
RUN useradd -d /home/jenkins -m -s /bin/bash jenkins
#RUN chown -R jenkins:jenkins /home/jenkins
USER jenkins
ENV HOME /home/jenkins
WORKDIR /home/jenkins
# Maven settings
RUN mkdir .m2
ADD settings.xml .m2/settings.xml
USER root
RUN chown -R jenkins:jenkins .m2
USER jenkins
ENTRYPOINT ["java", "-jar", "/opt/jenkins.war"]
EXPOSE 8080
CMD [""]
第二道工序
root 28409 13575 0 16:13 ? 00:00:00 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 8080
不是您的jenkins容器的過程,而是Docker引擎管理網絡的內部過程。
如果使用ps
命令無法在docker容器中找到應該運行的進程,則意味着docker容器未運行。
為了解決這個問題,請使用以下命令啟動容器(添加--name test
):
docker run --name test -u jenkins -d -t -p 8080:8080 -v /var/foo:/foo -P docker-registry:5000/bar/helloworld:001
然后輸入docker ps
,您應該看到容器正在運行。 如果不是,請鍵入docker ps -a
,您應該看到崩潰的退出代碼 。
如果您需要知道它為什么崩潰,請使用docker logs test
顯示其日志。
要查找從官方Jenkins Docker映像運行的Jenkins進程,請使用以下命令:
ps aux | grep java
從docker主機的角度來看,為什么文件似乎歸
admin
所有?
在您的jenkins
映像中, jenkins
用戶的UID為 1000
。 您可以使用以下命令輕松地進行驗證: docker run --rm -u jenkins --entrypoint /bin/id docker-registry:5000/bar/helloworld:001
uid = 1000(詹金斯)gid = 1000(詹金斯)組= 1000(詹金斯)
在您的Docker主機上, UID 1000
適用於admin
用戶。 您可以使用id admin
進行驗證,在您的情況下顯示為:
uid = 1000(admin)gid = 1000(admin)組= 1000(admin),10(滾輪)
Docker容器中可用的用戶不是Docker主機中的用戶。 但是,它們具有相同的UID可能是偶然發生的。 這就是為什么在docker主機上運行ls -l
命令會告訴您文件由admin
用戶擁有的原因。
實際上,文件由UID 1000
的用戶擁有, UID 1000
恰好在jenkins
主機上命名為admin
,在jenkins
上命名為jenkins
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.