Docker Rootless中的Docker Rootless,这可能吗?

问题描述

对于我的工作,我想在Jenkins中运行Docker RootlessDocker Rootless(仅针对该容器使用sysbox运行时)。

我想这样做是因为我需要一个安全的环境,因为我不检查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 套接字在哪个 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...