Docker, монтировать тома только для чтения

107

Я работаю с Docker, и я хочу смонтировать динамическую папку, которая сильно меняется (чтобы мне не пришлось создавать образ Docker для каждого выполнения, что было бы слишком дорого), но я хочу, чтобы эта папка была доступна только для чтения . Смена владельца папки на другого работает. Однако chownтребуется rootдоступ, который я бы предпочел не предоставлять приложению.

Когда я использую -vфлаг для монтирования, он дает то имя пользователя, которое я даю, я создал пользователя без полномочий root внутри образа докера, однако все файлы в томе с владельцем в качестве пользователя, запустившего докер, меняются на пользователя I give из командной строки, поэтому я не могу создавать файлы и папки только для чтения. Как я могу предотвратить это?

Я также добавил mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, чтобы я мог перейти на другого пользователя через терминал, но все же файлы имеют разрешения для моего пользователя.

Мустафа
источник
Просто подумал, что оставлю здесь комментарий, в котором говорится, что предоставление пользователю возможности запускать контейнеры докеров - это то же самое, что предоставление ему полного корневого доступа. Это также задокументировано в разделе безопасности документации докера.
Blackclaws 08

Ответы:

171

Вы можете указать, что том должен быть доступен только для чтения, добавив :roк -vпереключателю:

docker run -v volume-name:/path/in/container:ro my/image

Обратите внимание, что в этом случае папка будет доступна только для чтения в контейнере и для чтения-записи на хосте.

2018 Править

Согласно документации по использованию томов , теперь существует другой способ монтировать тома с помощью --mountпереключателя. Вот как это использовать в режиме только для чтения:

$ docker run --mount source=volume-name,destination=/path/in/container,readonly my/image

докер-сочинять

Вот пример того, как указать контейнеры только для чтения в docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Альп
источник
8
есть ли возможность записи, но не записывать их обратно на хост? это было бы фантастически
Рэй Фосс
9
Похоже, вы хотите вообще не указывать громкость.
Альп
1
Вроде ... Мне просто не нравится создавать образ только для того, чтобы использовать Dockerfile COPY или использовать отдельную docker cpкоманду для отключенного контейнера.
Рэй Фосс
5
Может быть, вы могли бы создать для этого новый вопрос, где вы предоставите более подробную информацию, и разместите его здесь?
Alp
Вы также можете использовать короткий синтаксис с docker redis:alpine:ro
compote
23

докер-сочинять

Вот правильный способ указать том только для чтения в docker-compose:

version: "3.2" # Use version 3.2 or above
services:
  my_service:
    image: my:image
    volumes:
      - type: volume
        source: volume-name
        target: /path/in/container
        read_only: true
volumes:
  volume-name:

https://docs.docker.com/compose/compose-file/#long-syntax-3

Денис Стафичук
источник
2
Это действительно правильно, но здесь только для чтения - это том, а не контейнер.
Константин Ван
Это работает только для меня с version: "3.2"- Спасибо :)
Дэйви
"Добавлено в формате файла версии 3.2." Угу
rybo111
3
Вы также можете сделать - './my-file.txt:/container-readonly-file.txt:ro'под volumes- обратите внимание :roна в конце.
rybo111