На RHEL-подобных дистрибутивах SELinux часто в режиме enforcing. Типичная ошибка после переноса compose с Ubuntu: контейнер стартует, а в логах Permission denied на смонтированный каталог. Это не «сломанный Docker» — метки SELinux не совпадают с ожиданиями контейнера.

SELinux и Docker volumes на AlmaLinux / Rocky 9

1. Проверка режима

getenforce
sestatus | head -5

Если Enforcing — читайте дальше. Если Permissive/Disabled, проблема скорее в правах Unix (chown/chmod).

2. Флаги :z и :Z

В docker-compose.yml:

volumes:
  - ./data:/var/lib/app:Z
Флаг Смысл
:Z Приватная метка для этого контейнера
:z Общая метка — каталог могут читать несколько контейнеров

Для одного сервиса берите :Z. Если один volume делят два контейнера — :z.

Пример:

services:
  app:
    image: alpine
    volumes:
      - ./appdata:/data:Z
    command: ["sh", "-c", "touch /data/ok && sleep infinity"]

3. Ручная метка (если нужно)

# каталог на хосте
chcon -Rt container_file_t ./appdata
# или через restorecon после semanage fcontext

Не отключайте SELinux «чтобы заработало» — сначала попробуйте :Z / :z.

4. Диагностика

# отказы SELinux в журнале
ausearch -m avc -ts recent | tail -30
# или
journalctl -b | grep -i denied | tail -20

Если отказ связан с container_t и вашим путём — почти всегда помогает правильный volume-флаг.

5. Docker и firewalld — отдельно

SELinux решает доступ к файлам. Открытость портов — зона firewalld/DOCKER-USER. Путать эти слои не стоит: «порт не открывается» ≠ «Permission denied на volume».

Итог

На Alma/Rocky 9 для bind-mount в compose по умолчанию добавляйте :Z (или :z при шаринге). Это быстрее и безопаснее, чем setenforce 0.