簡體   English   中英

Docker Rootless 在 Docker Rootless 中,這是可能的嗎?

[英]Docker Rootless in Docker Rootless, It's possble?

對於我的工作,我想運行JenkinsDocker Rootless (只有該容器的sysbox運行時),所有的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套接字在哪個 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你會看到第一個和第二個變量是我們設置的。 可以在此處找到更多詳細信息: 如何在 dockerized Jenkins 安裝中運行無根 docker

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM