다음 명령을 사용하여 루트 아래의 podman에서 공식 nginx 이미지를 시작했습니다.
sudo podman run --name nginx \
... \
-v /var/log/nginx:/var/log/nginx \
docker.io/library/nginx:latest
로깅은 제대로 작동하지만 인터넷에서 가져온 모든 구성을 사용하여 호스트에서 로그 회전을 시도하면 실패합니다. 예:
/var/log/nginx/*.log {
hourly
missingok
rotate 24
compress
delaycompress
notifempty
su root root
create 0644
sharedscripts
postrotate
podman exec nginx /bin/bash reset_log.sh
endscript
}
Reset_log.sh 스크립트에는 새 로그를 시작하는 잘 알려진 명령이 포함되어 있으며, 컨테이너에 로그인하여 수동으로 실행하면 예상대로 작동합니다.
kill -USR1 `cat /var/run/nginx.pid`
하지만 이 모든 것들이 예상대로 함께 작동하지 않고, access.log.1 파일에 계속해서 로깅되거나 전혀 로깅되지 않습니다. "su root root"나 "create .." 없이 변형을 시도했지만 성공하지 못했습니다.
업데이트: 추가 조사가 필요한 권한 문제가 있는 것 같습니다. logrotate -f -v /etc/logrotate.conf 명령을 수동으로 강제 적용하면 예상대로 작동합니다. selinux 또는 apparmor(arch linux)가 호스트에 설치되어 있지 않습니다.
systemd[1]: Starting Rotate log files...
conmon[4388]: conmon 32834b35446220b4e6d4 <nwarn>: runtime stderr: setns `mnt`: Operation not permitted
fail startup
conmon[4388]: conmon 32834b35446220b4e6d4 <error>: Failed to create container: exit status 1
logrotate[4377]: Error: crun: setns `mnt`: Operation not permitted: OCI permission denied
logrotate[4374]: error: error running shared postrotate script for '/var/log/nginx/*.log '
systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: logrotate.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Rotate log files.
답변1
podman exec nginx ...
가장 간단한 해결책은 아마도 다음과 같이 사용을 바꾸는 것입니다 podman kill
.
/var/log/nginx/*.log {
hourly
missingok
rotate 24
compress
delaycompress
notifempty
su root root
create 0644
sharedscripts
postrotate
podman kill --signal USR1 nginx
endscript
}
podman kill
이는 지정된 신호가 nginx인 컨테이너의 PID 1로 전송되기 때문에 작동합니다 . 컨테이너 에 들어갈 필요도 없고 /var/run/nginx.pid
컨테이너에 전혀 들어갈 필요도 없으므로 "OCI 권한 거부" 오류를 일으키는 문제를 피할 수 있습니다.
근본적인 문제는 (Rocky 9) logrotate
에서 볼 수 있는 다양한 보호 기능을 사용하여 서비스가 실행되고 있다는 것입니다./lib/systemd/system/logrotate.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no NoNewPrivileges for third party rotate scripts
# no RestrictSUIDSGID for creating setgid directories
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=full
RestrictNamespaces=true
RestrictRealtime=true
주요 제한 사항은 RestrictNamespaces=true
다음과 같은 옵션입니다.문서:
이 장치의 프로세스가 Linux 네임스페이스 기능에 액세스하지 못하도록 제한합니다...true인 경우 모든 유형의 네임스페이스에 대한 액세스가 금지됩니다.
무엇보다도 이는 대체 설치 네임스페이스에 대한 액세스를 차단하므로 podman exec
작동하지 않습니다. systemd 재정의 단위를 사용하여 제한을 제거할 수 있지만 podman kill
변경 사항이 더 적기 때문에 사용하는 것이 더 깔끔합니다.