Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Suporte para rodar systemd dentro de containers Docker #10

Open
lgfa29 opened this issue Mar 27, 2022 · 0 comments
Open

Suporte para rodar systemd dentro de containers Docker #10

lgfa29 opened this issue Mar 27, 2022 · 0 comments

Comments

@lgfa29
Copy link
Member

lgfa29 commented Mar 27, 2022

É comum que uma role Ansible instale pacotes que utilizem unidades systemd para rodar. Como utilizamos o driver docker do molecule para testar as nossas roles, é preciso que o container utilizado como alvo seja capaz de rodar systemd, o que não é possível por padrão.

Até então, a forma como isso vinha sendo feito é utilizar uma imagem base pré-configurada com systemd e montar o caminho /sys/fs/cgroup do host dentro do container usando a seguite configuração do molecule:

platforms:
  # ...
  volumes:
    - /sys/fs/cgroup:/sys/fs/cgroup:ro

Esse caminho é a raiz da hierarquia dos processos que estão rodando dentro dos cgroups, e isso funcionava anteriormente porque a maioria das ferramentas e distribuições Linux usavam a versão v1 do cgroups.

Mas, recentemente, essas ferramentas e distros passaram a migrar para utilizar a versão v2 de cgroups por padrão. Nessa nova versão, a hierarquia dos arquivos que descrevem os processos foi alterada para uma hierarquia unificada, de forma que apenas montar esse volume não é mais suportado.

O systemd passou a utilizar a hierarquia unificada como padrão a partir da versão 243. O Docker suporta cgroup v2 desde a versão 20.10.0 e o Docker Desktop começou a usar cgroup v2 como padrão na versão 4.3.0. Debian 11, Ubuntu 21.10, Fedora 31 e Arch Linux também já utilizam cgroup v2 por padrão.

Essas mudanças resultam em diversos problemas na hora de testar roles localmente, uma vez que cada máquina poderá utilizar versões diferentes dessas ferramentas.

Alternativas

Por enquanto não existe uma solução definitiva para o problema. A opção mais promissora para ser usar a flag --cgroupns host na criação do container, mas isso ainda não é suportado pelo molecule.

A melhor alternativa, por enquanto, é reverter configurações locais para utilizar a versão v1 do cgroups.

Linux

Adicionar a opção systemd.unified_cgroup_hierarchy=0 na configuração de boot do kernel.

Para sistemas Fedore/Centos/RHEL, é possível utilizar a ferramenta grubby:

$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

Para sistemas Ubuntu/Debian esse valor pode ser definido na variável GRUB_CMDLINE_LINUX no arquivo /etc/default/grub e depois executando o comando sudo update-grub.

Reinicie o seu computador para aplicar a mudança.

Docker Desktop for Mac

Edite o arquivo ~/Library/Group\ Containers/group.com.docker/settings.json para habilitar a opção deprecatedCgroupv1:

{
  ...
  "deprecatedCgroupv1": true,
  ...
}

Reinicie o Docker Desktop.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant