Как задать права доступа (read-only/read-write) для монтирования томов в Docker?

«Как задать права доступа (read-only/read-write) для монтирования томов в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Права доступа при монтировании томов или хостовых директорий в Docker задаются через флаги -v (volume) или --mount. Это критически важно для безопасности контейнера.

1. Использование флага -v (синтаксис legacy, но распространенный)

# Монтирование с правами только для чтения (ro)
docker run -v /host/data:/container/data:ro nginx:alpine

# Монтирование с правами чтения и записи (rw, используется по умолчанию)
docker run -v /host/data:/container/data:rw nginx:alpine
# Или просто (rw подразумевается)
docker run -v /host/data:/container/data nginx:alpine

2. Использование флага --mount (рекомендуемый, более явный синтаксис)

# Только для чтения
docker run 
  --mount type=bind,source=/host/data,target=/container/data,readonly 
  nginx:alpine

# Чтение и запись
docker run 
  --mount type=bind,source=/host/data,target=/container/data 
  nginx:alpine

# Для именованных томов
docker run 
  --mount type=volume,source=mydata,target=/container/data,readonly 
  nginx:alpine

3. Особый случай: tmpfs-монтирование Монтирует временную файловую систему в память. Позволяет задать права на уровне монтирования.

docker run 
  --tmpfs /tmp:rw,noexec,nosuid,size=100m 
  alpine
# Эквивалент через --mount
docker run 
  --mount type=tmpfs,destination=/tmp,tmpfs-mode=1777,tmpfs-size=100m 
  alpine

Ключевые моменты для DevOps:

  • Безопасность: Всегда монтируйте системные директории хоста (/, /etc, /var/run/docker.sock) только в режиме readonly, если это абсолютно необходимо.
  • Консистентность: Права на файлы внутри тома определяются UID/GID пользователя контейнера и правами файлов на хосте. Используйте USER в Dockerfile и убедитесь в совместимости идентификаторов.
  • Автоматизация: В Docker Compose права указываются так:
    services:
      app:
        volumes:
          - "./config:/etc/app:ro"
          - "app_data:/data:rw"