Iniciei a imagem oficial do nginx no podman no root com o comando:
sudo podman run --name nginx \
... \
-v /var/log/nginx:/var/log/nginx \
docker.io/library/nginx:latest
Logging funcionando ok, mas ao tentar logrotate na máquina host com todas as configurações retiradas da internet ele falha, por exemplo esta:
/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
}
O script reset_log.sh contém um comando bem conhecido para iniciar um novo log e funciona conforme o esperado se você fizer login no contêiner e executar manualmente:
kill -USR1 `cat /var/run/nginx.pid`
Mas tudo isso não funciona junto como esperado, o registro continua no arquivo access.log.1 ou nenhum registro. Tentei variantes sem 'su root root', sem 'create ..' - sem sucesso.
Atualização: parece que há um problema de permissão, precisa de mais investigação. O comando manual aplicado logrotate -f -v /etc/logrotate.conf funciona conforme o esperado. Nenhum selinux ou apparmor instalado no host (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.
A solução mais fácil é provavelmente substituir o uso de
podman exec nginx ...
porpodman kill
:Isso funciona porque
podman kill
envia o sinal especificado para o PID 1 no contêiner, que sabemos ser nginx. Não precisamos/var/run/nginx.pid
e nem precisamos entrar no contêiner, evitando assim os problemas que causam o erro "Permissão OCI negada".O problema subjacente é que o
logrotate
serviço é executado com uma variedade de proteções habilitadas; olhando/lib/systemd/system/logrotate.service
(em Rocky 9), vemos:A principal restrição é a
RestrictNamespaces=true
opção; da documentação :Entre outras coisas, isso impede o acesso a namespaces de montagem alternativos e, portanto,
podman exec
não funciona. Você poderia remover a restrição com uma unidade de substituição do systemd, mas usarpodman kill
é mais limpo porque requer menos alterações.