Docker无根在Docker无根,有可能吗?
Docker Rootless in Docker Rootless, It's possble?
对于我的工作,我想 运行 Jenkins
和 Docker Rootless
(使用 sysbox 运行time only for this container),都在 Docker Rootless
.
我想要这个,因为我需要一个安全的环境,因为我不检查 Jenkins 管道
但是当我 运行 docker rootless 在 docker rootless 时,我得到这个错误:
[rootlesskit:parent] error: failed to setup UID/GID map: newuidmap 54 [0 1000 1 1 100000 65536] failed: newuidmap: write to uid_map failed: Operation not permitted
: exit status 1
我尝试了很多操作,但都没有成功。请问有人有解决办法吗?
感谢阅读我的文章,祝你有愉快的一天!
编辑 1
你好,我冒昧地重新提出这个问题,因为对我们环境的安全至关重要,我的老板每天都提醒我。请问有人知道这个问题的答案吗
当您想在 Jenkins 容器中使用 docker build
命令时,事情变得有点棘手。
当我想在用户 'jenkins' 下构建 docker 图像而不是 root 时,我偶然发现了这个问题。
我在一篇文章中写了解决方案,其中我详细解释了幕后发生的事情。
关键是弄清楚 docker.sock
套接字 运行ning 在哪个 GID 下(取决于系统)。所以这是你要做的:
运行命令:
$ stat /var/run/docker.sock
输出:
jenkins@wsl-ubuntu:~$ stat /var/run/docker.sock
File: /var/run/docker.sock
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 17h/23d Inode: 552 Links: 1
Access: (0660/srw-rw----) Uid: ( 0/ root) Gid: ( 1001/ docker)
Access: 2021-03-03 10:43:05.570000000 +0200
Modify: 2021-03-03 10:43:05.570000000 +0200
Change: 2021-03-03 10:43:05.570000000 +0200
Birth: -
在这种情况下,GID 是 1001,但也可以是 999 或您机器中的其他名称。
现在,创建一个 Dockerfile 并粘贴下面的代码,将上面 stat 命令输出中的 ENV 变量替换为您自己的变量:
FROM jenkins/jenkins:lts-alpine
USER root
ARG DOCKER_HOST_GID=1001 #Replace with your own docker.sock GID
ARG JAVA_OPTS=""
ENV DOCKER_HOST_GID $DOCKER_HOST_GID
ENV JAVA_OPTS $JAVA_OPTS
RUN set -eux \
&& apk --no-cache update \
&& apk --no-cache upgrade --available \
&& apk --no-cache add shadow \
&& apk --no-cache add docker curl --repository http://dl-cdn.alpinelinux.org/alpine/latest-stable/community \
&& deluser --remove-home jenkins \
&& addgroup -S jenkins -g $DOCKER_HOST_GID \
&& adduser -S -G jenkins -u $DOCKER_HOST_GID jenkins \
&& usermod -aG docker jenkins \
&& apk del shadow curl
USER jenkins
WORKDIR $JENKINS_HOME
为了一个工作示例,这里是一个 docker-compose 文件:
version: '3.3'
services:
jenkins:
image: jenkins_master
container_name: jenkins_master
hostname: jenkins_master
restart: unless-stopped
env_file:
- jenkins.env
build:
context: .
cpus: 2
mem_limit: 1024m
mem_reservation: 800M
ports:
- 8090:8080
- 50010:50000
- 2375:2376
volumes:
- ./jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
networks:
- default
volumes:
jenkins_data: {}
networks:
default:
driver: bridge
现在让我们创建 ENV 变量:
cat > jenkins.env <<EOF
DOCKER_HOST_GID=1001 #Replace with your own docker.sock GID
JAVA_OPTS=-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
EOF
最后,运行 命令 docker-compose up -d
。
它将构建图像,然后 运行 它。
然后访问 HTTP://host_machine_ip:8090 就可以了。
如果你运行 docker inspect --format '{{ index (index .Config.Env) }}' jenkins_master
你会看到第一个和第二个变量是我们设置的。
可以在此处找到更多详细信息:How to run rootless docker in dockerized Jenkins installation
对于我的工作,我想 运行 Jenkins
和 Docker Rootless
(使用 sysbox 运行time only for this container),都在 Docker Rootless
.
我想要这个,因为我需要一个安全的环境,因为我不检查 Jenkins 管道
但是当我 运行 docker rootless 在 docker rootless 时,我得到这个错误:
[rootlesskit:parent] error: failed to setup UID/GID map: newuidmap 54 [0 1000 1 1 100000 65536] failed: newuidmap: write to uid_map failed: Operation not permitted
: exit status 1
我尝试了很多操作,但都没有成功。请问有人有解决办法吗?
感谢阅读我的文章,祝你有愉快的一天!
编辑 1
你好,我冒昧地重新提出这个问题,因为对我们环境的安全至关重要,我的老板每天都提醒我。请问有人知道这个问题的答案吗
当您想在 Jenkins 容器中使用 docker build
命令时,事情变得有点棘手。
当我想在用户 'jenkins' 下构建 docker 图像而不是 root 时,我偶然发现了这个问题。
我在一篇文章中写了解决方案,其中我详细解释了幕后发生的事情。
关键是弄清楚 docker.sock
套接字 运行ning 在哪个 GID 下(取决于系统)。所以这是你要做的:
运行命令:
$ stat /var/run/docker.sock
输出:
jenkins@wsl-ubuntu:~$ stat /var/run/docker.sock
File: /var/run/docker.sock
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 17h/23d Inode: 552 Links: 1
Access: (0660/srw-rw----) Uid: ( 0/ root) Gid: ( 1001/ docker)
Access: 2021-03-03 10:43:05.570000000 +0200
Modify: 2021-03-03 10:43:05.570000000 +0200
Change: 2021-03-03 10:43:05.570000000 +0200
Birth: -
在这种情况下,GID 是 1001,但也可以是 999 或您机器中的其他名称。
现在,创建一个 Dockerfile 并粘贴下面的代码,将上面 stat 命令输出中的 ENV 变量替换为您自己的变量:
FROM jenkins/jenkins:lts-alpine
USER root
ARG DOCKER_HOST_GID=1001 #Replace with your own docker.sock GID
ARG JAVA_OPTS=""
ENV DOCKER_HOST_GID $DOCKER_HOST_GID
ENV JAVA_OPTS $JAVA_OPTS
RUN set -eux \
&& apk --no-cache update \
&& apk --no-cache upgrade --available \
&& apk --no-cache add shadow \
&& apk --no-cache add docker curl --repository http://dl-cdn.alpinelinux.org/alpine/latest-stable/community \
&& deluser --remove-home jenkins \
&& addgroup -S jenkins -g $DOCKER_HOST_GID \
&& adduser -S -G jenkins -u $DOCKER_HOST_GID jenkins \
&& usermod -aG docker jenkins \
&& apk del shadow curl
USER jenkins
WORKDIR $JENKINS_HOME
为了一个工作示例,这里是一个 docker-compose 文件:
version: '3.3'
services:
jenkins:
image: jenkins_master
container_name: jenkins_master
hostname: jenkins_master
restart: unless-stopped
env_file:
- jenkins.env
build:
context: .
cpus: 2
mem_limit: 1024m
mem_reservation: 800M
ports:
- 8090:8080
- 50010:50000
- 2375:2376
volumes:
- ./jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
networks:
- default
volumes:
jenkins_data: {}
networks:
default:
driver: bridge
现在让我们创建 ENV 变量:
cat > jenkins.env <<EOF
DOCKER_HOST_GID=1001 #Replace with your own docker.sock GID
JAVA_OPTS=-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
EOF
最后,运行 命令 docker-compose up -d
。
它将构建图像,然后 运行 它。
然后访问 HTTP://host_machine_ip:8090 就可以了。
如果你运行 docker inspect --format '{{ index (index .Config.Env) }}' jenkins_master
你会看到第一个和第二个变量是我们设置的。
可以在此处找到更多详细信息:How to run rootless docker in dockerized Jenkins installation