Docker Rootless в Docker Rootless, это возможно?
По работе я бы хотел сбежать
Jenkins
и
Docker Rootless
(со средой выполнения sysbox только для этого контейнера), все в
Docker Rootless
.
Я бы хотел этого, потому что мне нужна безопасная среда, поскольку я не проверяю конвейеры Jenkins
Но когда я запускаю докер без рута в докере без рута, я получаю эту ошибку:
[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
Здравствуйте, я беру на себя смелость повторно задать этот вопрос, потому что мои боссы ежедневно напоминают мне об этом, поскольку это важно для безопасности нашей окружающей среды. У кого-нибудь есть ответ на эту проблему, пожалуйста
1 ответ
Все становится немного сложнее, когда вы хотите использовать
docker build
внутри контейнера Jenkins. Я наткнулся на эту проблему, когда хотел создавать образы докеров, не будучи root, вместо этого под пользователем «jenkins». Я написал решение в статье, в которой подробно объясняю, что происходит под капотом. Ключевым моментом является выяснить, какой GID
docker.sock
сокет работает под управлением (зависит от системы). Итак, вот что вам нужно сделать:
Запустите команду:
$ 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 и вставьте приведенный ниже код, заменив переменную ENV своей собственной из вывода команды stat выше:
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
вы увидите, что 1-я и 2-я переменные - это те, которые мы установили. Более подробную информацию можно найти здесь: Как запустить докер без рута в докеризованной установке Jenkins