我试过这个post并没有帮助。
我创建了jenkins
用户并将其添加到docker组。
我还在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
第一个是守护进程。所以我想成为root是可以的。
但第二个(我通过发布sudo su jenkins
切换到jenkins用户)显示root
。我作为jenkins用户启动了docker。为什么这个过程属于root?
这是我的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进程(war)由“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 [""]
答案 0 :(得分:1)
第二个过程
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
用户有 UID 1000
。您可以使用以下命令轻松验证:docker run --rm -u jenkins --entrypoint /bin/id docker-registry:5000/bar/helloworld:001
uid = 1000(jenkins)gid = 1000(詹金斯)组= 1000(詹金斯)
在您的泊坞主机上, UID 1000
适用于admin
用户。您可以使用id admin
验证这一点,在您的案例中显示:
uid = 1000(admin)gid = 1000(admin)groups = 1000(admin),10(wheel)
Docker容器中可用的用户不是docker主机中的用户。然而,巧合可能会发生它们具有相同的 UID 。这就是在docker主机上运行的ls -l
命令将告诉您文件归admin
用户所有的原因。
实际上这些文件归 UID 1000
的用户所有,该用户恰好在docker主机上命名为admin
,而jenkins
上的文件名为 [{"staffId":4,"forename":"Testf","surname":"Tests","location":"Testl","phoneNumber":"00000000000","email":"Teste"}]
您的码头图片。