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

我试过这个 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 [""]

编辑2

我确定容器正在运行。我可以附在容器上。
我也可以浏览 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 [""] 

最佳答案

第二道工序

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

编辑

why does the files seem to be owned by admin from the docker host point of view?



在您的 docker 镜像中,jenkins用户有 UID 1000 .您可以使用以下命令轻松验证这一点: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用户。您可以使用 id admin 来验证这一点。在您的情况下显示:

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



Docker 容器中可用的用户不是来自 Docker 主机的用户。然而,它们可能具有相同的 UID 是巧合。这就是为什么ls -l在 docker 主机上运行的命令会告诉您文件归 admin 所有。用户。

事实上文件归 UID 1000 的用户所有恰好名为 admin在 docker 主机和 jenkins 上在您的 docker 镜像上。

https://stackoverflow.com/questions/34688261/

相关文章:

docker - 运行openshift/origin docker时出错:运行 'chcon'来设

docker - 我自己对 boot2docker 的自定义没有反射(reflect)到 iso 镜

docker - Docker:对apache虚拟主机进行Docker化

amazon-web-services - 我可以安排Docker在特定时间在Amazon ECS上

logging - Dockerized Kibana外部化日志

amazon-web-services - 如何为Docker注册日志记录驱动程序?

amazon-web-services - 如何使用 Amazon ECS 从 Tutum 私有(p

hadoop - Pig:访问内部元组的字段进行过滤

docker - 是 "docker start"完全恢复由 "docker run"启动的所有正在

makefile - 获取刚刚生成的图像的ID