繁体   English   中英

无法以非root用户身份运行docker?

[英]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 [""]

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

但是从主机文件系统中,我看到新创建的“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM