无法运行docker作为非root用户?

我已经尝试过这个post ,并没有帮助。

我已经创build了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 [""] 

EDIT2

我确定容器正在运行。 我可以附在容器上。 我也可以通过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 

但从主机文件系统,我看到新创build的“jobs”目录显示为用户“admin”

 ls -l /var/jenkins/ drwxr-xr-x 2 admin admin 4096 Jan 11 10:54 jobs 

在容器内部,jenkins过程(战争)由“jenkins”用户启动。 一旦jenkins启动,它将以“admin”用户的身份写入主机文件系统。

这是我的整个docker文件(注意:我不使用从这里的一个)

 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引擎pipe理networking的内部过程。


如果使用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 ,你应该看到你的容器运行。 如果没有,inputdocker ps -a ,你应该看到它崩溃的退出代码

如果您需要知道为什么崩溃,请使用docker logs test显示其日志。


要查找从Jenkins官方docker镜像运行的Jenkins进程,请使用以下命令:

 ps aux | grep java 

编辑

为什么从docker主机的angular度来看,这些文件似乎是由admin拥有?

在您的泊坞窗图像中, jenkins用户有UID 1000 。 您可以使用以下命令轻松validation此操作: docker run --rm -u jenkins --entrypoint /bin/id docker-registry:5000/bar/helloworld:001

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

在您的docker主机上, UID 1000是为admin用户。 你可以validation这与id admin在你的情况显示:

uid = 1000(admin)gid = 1000(admin)groups = 1000(admin),10(wheel)

Docker容器中可用的用户不是来自Docker主机的用户。 但是巧合的是,它们有相同的UID 。 这就是为什么在docker主机上运行ls -l命令会告诉你这些文件是由admin用户拥有的。

事实上, 这些文件是由UID 1000的用户拥有的,恰好在jenkins主机上被命名为admin ,在jenkins上被命名为jenkins