Вопрос или проблема
Я пытаюсь запустить podman
quadlet, определённый с помощью файла YML Kubernetes.
Я хочу, чтобы он работал без прав суперпользователя в systemd
под пользователем web
на хосте: systemctl --user status pod-web
.
Внутри контейнера процесс PHP работает под пользователем 33:33
.
Я хочу, чтобы директория /home/web/data
на хосте принадлежала пользователю web
, но при этом была доступна для чтения и записи пользователю 33:33
внутри контейнера, где она смонтирована по пути /var/www/html
.
В комментариях вы можете увидеть некоторые вещи, которые я пробовал.
К сожалению, я не понимаю пространства имен пользователей и subuid/subgid достаточно хорошо, чтобы заставить это работать с документацией, и Copilot продолжает заблуждаться, поэтому любая помощь от настоящих людей будет признательна.
Моя проблема аналогична этой, но я хочу использовать quadlet podman kube
, определённый в файле YML.
Окружение:
AlmaLinux release 9.4 (Seafoam Ocelot)
podman version 4.9.4-rhel
systemd 252 (252-32.el9_4.7)
- SELinux включен в режиме принуждения
chown -R web:web /home/web
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web
/home/web/pod-web.yml
:
apiVersion: v1
kind: Pod
metadata:
name: pod-web
# annotations:
# io.podman.annotations.userns: "keep-id"
spec:
containers:
- name: pod-web
image: docker.io/library/php:8.3-apache
# securityContext:
# runAsUser: 33
# runAsGroup: 33
# supplementalGroups: [65536]
# ports:
# - containerPort: 80
# hostPort: 8000
volumeMounts:
- mountPath: /var/www/html
name: web-data
volumes:
- name: web-data
hostPath:
path: /home/web/data
restartPolicy: Always
С runAsUser: 33
контейнер выдавал следующее:
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
С runAsUser: 0
контейнер, похоже, работает, но это плохая практика, так как это даёт слишком много привилегий, если я правильно понимаю.
/home/web/.config/containers/systemd/pod-web.kube
:
[Unit]
Description=Podman Quadlet: %p
[Service]
# ExecStartPre=/usr/bin/podman unshare -- /bin/bash -c 'chown -R 33:33 /home/web/data'
[Kube]
Yaml=/home/web/%p.yml
LogDriver=journald
#UserNS=keep-id:uid=33,gid=33
#UserNS=auto
[Install]
WantedBy=multi-user.target default.target
Я думаю, что это работает с UserNS=auto
, но я сделал так много различных изменений, что теперь не уверен.
Ответ или решение
Для решения вашей задачи по запуску контейнера Podman в режиме rootless с использование kubernetes YAML файла и с соответствующей настройкой прав доступа, выполним следующие шаги:
Подготовка окружения
-
Настройка под пользователей и группы:
Убедитесь, что у пользователяweb
есть доступ к подидентификаторам, соответствующим UID и GID, используемым внутри контейнера:usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web
-
Права на директорию:
Помните, что директория/home/web/data
должна быть доступна пользователю33:33
, который соответствует пользователюwww-data
(или аналогичному) внутри контейнера.
Используйте следующую команду, чтобы установить правильные права:sudo chown -R web:web /home/web sudo chmod -R 770 /home/web/data
YAML файл конфигурации
Ваш файл /home/web/pod-web.yml
должен выглядеть так:
apiVersion: v1
kind: Pod
metadata:
name: pod-web
spec:
containers:
- name: pod-web
image: docker.io/library/php:8.3-apache
securityContext:
runAsUser: 33 # пользователь внутри контейнера
runAsGroup: 33 # группа внутри контейнера
supplementalGroups: [65536] # дополнительные группы
volumeMounts:
- mountPath: /var/www/html
name: web-data
volumes:
- name: web-data
hostPath:
path: /home/web/data
restartPolicy: Always
Настройка systemd Unit файла
Файл /home/web/.config/containers/systemd/pod-web.kube
должен содержать следующее:
[Unit]
Description=Podman Quadlet: %p
[Service]
ExecStartPre=/usr/bin/podman unshare -- /bin/bash -c 'chown -R 33:33 /home/web/data'
[Kube]
Yaml=/home/web/%p.yml
LogDriver=journald
UserNS=auto # Проверит и автоматически настроит пространство имен пользователей
[Install]
WantedBy=multi-user.target default.target
Примечания к настройкам
-
UserNS=auto: Это позволит Podman автоматически управлять пространством имен пользователей. С этой настройкой, необходимые сопоставления UID/GID будут применены, что позволит вам запускать контейнеры и сохранять права доступа.
-
Используйте ExecStartPre: Эта команда выполняется перед запуском контейнера и позволяет вам установить правильные права на директорию, которая будет монтирована в контейнер. Убедитесь, что у вас есть необходимые права для выполнения этой команды.
-
SELinux: Убедитесь, что SELinux не блокирует доступ, или попробуйте временно отключить его для диагностики (не рекомендуется в продуктивной среде).
Запуск и тестирование
После того как вы создали все необходимые файлы и конфигурации, запустите сервис:
systemctl --user daemon-reload
systemctl --user start pod-web
systemctl --user status pod-web
Убедитесь, что сервис запустился без ошибок. Если возникнут проблемы, проверьте логи:
journalctl --user -u pod-web
Заключение
Следуя этим шагам, вы должны быть в состоянии настроить Podman для работы в режиме rootless, при этом сохранить права доступа к файлам, соответствующие специфике вашего приложения PHP. В случае возникновения дальнейших трудностей, постарайтесь предоставить больше информации о предпринимаемых шагах и наблюдаемых ошибках.