Ответ
Права доступа при монтировании томов или хостовых директорий в 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"