Docker совет №29: Создание read-only контейнеров
Jun 21, 2018 07:00 · 305 words · 2 minute read
Возможно, вам захочется запускать docker-контейнеры в режиме только для чтения (read-only) - например, для повышения безопасности или из-за специфических требований вашего приложения. Давайте разберемся!
У меня ни разу не возникало нужды запускать docker-контейнеры в режиме read-only, но интересно знать о подобном функционале. Сделать это очень легко, убедимся в этом с помощью простого теста:
docker run --rm --read-only alpine:3.7 touch hello.txt
> touch: hello.txt: Read-only file system
Как и ожидалось, на экране появилось сообщение о невозможности создать файл hello.txt
. Если выполнить предложенную команду без параметра --read-only
, то файл будет успешно создан.
Стоит отметить, что не все docker-образы поддерживают использование ключа --read-only
при старте контейнера - некоторые из них созданы так, что в обязательном порядке требуют возможности записывать служебные файлы в определенные каталоги (иначе контейнер просто не запустится).
Например, флаг --read-only
отлично сработает при запуске docker-контейнера с Redis:
docker run --rm -it --read-only redis:alpine
1:C 31 May 11:16:40.533 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 31 May 11:16:40.533 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
...
1:M 31 May 11:16:40.534 * Ready to accept connections
но не с Postgres:
docker run -it --read-only postgres:10.3-alpine
chown: /var/run/postgresql: Read-only file system
chown: /var/run/postgresql: Read-only file system
Побороть данную проблему можно монтированием тома с хост-системы внутрь docker-контейнера (разрешая таким образом запись) или с помощью еще одного параметра --tmpfs
. Например, если вы точно знаете, что приложение, упакованное в docker-контейнер, должно писать в каталоги /var
и /tmp
(как в случае с postgres), используйте следующую команду:
docker run -it --read-only --tmpfs /var --tmpfs /tmp postgres:10.3-alpine
The files belonging to this database system will be owned by user "postgres".
...
2018-05-31 11:30:11.256 UTC [1] LOG: database system is ready to accept connections
Ключ --tmpfs
при запуске docker-контейнера можно использовать несколько раз (сколько вам потребуется директорий для записи). Еще одно преимущество данного ключа в том, что вам не придется монтировать каталог с хост-системы.