Docker совет №29: Создание read-only контейнеров

Jun 21, 2018 07:00 · 305 words · 2 minute read docker

Возможно, вам захочется запускать 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-контейнера можно использовать несколько раз (сколько вам потребуется директорий для записи). Еще одно преимущество данного ключа в том, что вам не придется монтировать каталог с хост-системы.

tweet Share