Какая польза от VOLUME в этом официальном Dockerfile postgresql? - PullRequest
0 голосов
/ 04 апреля 2019

Я нашел следующий код в Dockerfile официального postgresql. https://github.com/docker-library/postgres/blob/master/11/Dockerfile

ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
VOLUME /var/lib/postgresql/data

Я хочу знать, какова цель VOLUME в этом отношении.

VOLUME /var/lib/postgresql/data

Насколько я понимаю, он создаст новый том хранения, когда мы запустим контейнер, и этот том хранения также будет окончательно удален при удалении контейнера (docker stop contianerid; docker rm containeid)

Тогда, если данные не будут сохраняться, зачем использовать это. Потому что VOLUME используются, если мы хотим, чтобы данные сохранялись.

У меня вопрос w.r.t, как его использовать, если данные postgres будут оставаться только до тех пор, пока контейнер не будет запущен, и после этого все будет уничтожено. Если я проделал большую работу и, в конце концов, все ушло, тогда какая польза.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Насколько я понимаю, он создаст новый том хранения, когда мы запустим контейнер, и этот том хранения также будет окончательно удален при удалении контейнера (docker stop contianerid; docker rm containeid)

Если вы запускаете контейнер с параметром --rm, анонимные тома удаляются при выходе из контейнера. Если вы не передадите параметр --rm при создании контейнера, то параметр -v для docker container rm также удалит тома. В противном случае эти анонимные тома сохранятся после остановки / rm.

Тем не менее, анонимными томами сложно управлять, поскольку неясно, какой том содержит какие данные. В частности, для таких изображений, как postgresql, я бы предпочел, чтобы они удалили строку VOLUME из своего Dockerfile и вместо этого предоставили составной файл, который определил том с именем. Вы можете узнать больше о том, что делает строка VOLUME и почему она создает проблемы, в моем ответе здесь .

0 голосов
/ 04 апреля 2019

Ваше понимание того, как тома работает, почти правильно, но не полностью.

Как вы заявили, когда вы создаете контейнер из изображения, определяющего VOLUME, докер действительно создаст анонимный том (то есть со случайным именем).

При остановке / удалении контейнера сам том не будет удален и будет по-прежнему доступен семейству команд docker volume.

Действительно, чтобы удалить контейнер и удалить связанные тома, вы должны использовать флаг -v, как в docker rm -v container-name.Эта команда удалит контейнер и удалит все анонимные тома , связанные с ним (именованный том никогда не будет удален, если явно не запрошено через docker volume rm volume-name).

Итак, чтобы подвести итог * 1020Директива * внутри Dockerfile используется для идентификации тех мест, в которых будут храниться постоянные данные, и обеспечения следующего:

  • данные сохранят жизнь контейнера по умолчанию
  • данные могут быть общимис другими контейнерами (т. е. --volumes-from)

Наиболее важным аспектом для меня является то, что он также служит своего рода неявной документацией для вашего пользователя, чтобы сообщить им, где хранится постоянное состояние (такчто они могут назвать тома с помощью флага -v docker run).

...