diff --git a/README.md b/README.md index 4d726260872f1c97ff7074ad05385b19e9bc7be6..5cb2aecd60165d1d8410a23729f22e696ad65a78 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ CMD ["python", "./my_script.py"] ## Инструкция ENV -Инструкция [**ENV**](https://docs.docker.com/engine/reference/builder/#env) позволяет задавать постоянные переменные среды, которые будут доступны в контейнере во время его выполнения. В предыдущем примере после создания контейнера можно пользоваться переменной ADMIN. +Инструкция [**ENV**](https://docs.docker.com/engine/reference/builder/#env) позволяет задавать постоянные переменные среды, которые **будут доступны в контейнере во время его выполнения**. В предыдущем примере после создания контейнера можно пользоваться переменной ADMIN. Инструкция ENV хорошо подходит для задания констант. Если вы используете некое значение в Dockerfile несколько раз, скажем, при описании команд, выполняющихся в контейнере, и подозреваете, что, возможно, вам когда-нибудь придётся сменить его на другое, его имеет смысл записать в подобную константу. @@ -208,7 +208,7 @@ VOLUME /my_volume ## Инструкция ARG -Инструкция [**ARG**](https://docs.docker.com/engine/reference/builder/#arg) позволяет задать переменную, значение которой можно передать из командной строки в образ во время его сборки. Значение для переменной по умолчанию можно представить в Dockerfile. Например: `ARG my_var=my_default_value`. +Инструкция [**ARG**](https://docs.docker.com/engine/reference/builder/#arg) позволяет задать переменную, значение которой можно передать из командной строки в образ во время его сборки. Значение для переменной по умолчанию можно представить в Dockerfile. Например: `ARG my_var=my_default_value`. **Будет доступен только во время сборки образа, но не в контейнере!** В отличие от **ENV**-переменных, **ARG**-переменные недоступны во время выполнения контейнера. Однако **ARG**-переменные можно использовать для задания значений по умолчанию для **ENV**-переменных из командной строки в процессе сборки образа. А **ENV**-переменные уже будут доступны в контейнере во время его выполнения. Подробности о такой методике работы с переменными можно почитать [здесь](https://vsupalov.com/docker-build-time-env-values/). @@ -233,10 +233,42 @@ VOLUME /my_volume Инструкция [**EXPOSE**](https://docs.docker.com/engine/reference/builder/#expose) указывает на то, какие порты планируется открыть для того, чтобы через них можно было бы связаться с работающим контейнером. Эта инструкция не открывает порты. Она, скорее, играет роль документации к образу, средством общения того, кто собирает образ, и того, кто запускает контейнер. Для того чтобы открыть порт (или порты) и настроить перенаправление портов, нужно выполнить команду `docker run` с ключом `-p`. Если использовать ключ в виде `-P` (с заглавной буквой P), то открыты будут все порты, указанные в инструкции **EXPOSE**. - +`По умолчанию **EXPOSE** предполагается TCP. Вы также можете указать UDP:` +``` +EXPOSE 80/udp +``` +`Чтобы открыть как TCP, так и UDP, включите две строки:` +``` +EXPOSE 80/tcp +EXPOSE 80/udp +``` ## Инструкция VOLUME -Инструкция [**VOLUME**](https://docs.docker.com/engine/reference/builder/#volume) позволяет указать место, которое контейнер будет использовать для постоянного хранения файлов и для работы с такими файлами. Об этом мы ещё поговорим. +Инструкция [**VOLUME**](https://docs.docker.com/engine/reference/builder/#volume) позволяет указать место, которое контейнер будет использовать для постоянного хранения файлов и для работы с такими файлами. +Инструкция **VOLUME** создает точку монтирования с указанным именем и помечает ее как содержащую внешне смонтированные тома из собственного хоста или других контейнеров. Значение может быть массивом `JSON VOLUME ["/var/log/"]`, или простой строкой с несколькими аргументами, такими как `VOLUME /var/log` или `VOLUME /var/log /var/db`. Для получения дополнительной информации/примеров и инструкций по монтированию через клиент Docker обратитесь к документации « Общие каталоги через тома » . + +Команда `docker run` инициализирует только что созданный том любыми данными, существующими в указанном месте в базовом образе. Например, рассмотрим следующий фрагмент Dockerfile: +``` +FROM ubuntu +RUN mkdir /myvol +RUN echo "hello world" > /myvol/greeting +VOLUME /myvol +``` + +Этот Dockerfile приводит к созданию образа, который вызывает `docker run` создание новой точки монтирования `/myvol` и копирование `greeting` файла во вновь созданный том. + +**Примечания об указании объемов** +Помните следующее о томах в `Dockerfile`. + +* **Тома в контейнерах на базе Windows** : при использовании контейнеров на базе Windows место назначения тома внутри контейнера должно быть одним из: + + * несуществующий или пустой каталог + * диск, отличный от `C:` +* **Изменение тома из Dockerfile** : если какие-либо шаги сборки изменяют данные внутри тома после его объявления, эти изменения будут отменены. + +* **Форматирование JSON** : список анализируется как массив JSON. Вы должны заключать слова в двойные кавычки `(")`, а не в одинарные кавычки `(')`. + +* **Каталог хоста объявляется во время выполнения контейнера** : каталог хоста (точка монтирования) по своей природе зависит от хоста. Это делается для сохранения переносимости образа, поскольку нельзя гарантировать, что данный каталог хоста будет доступен на всех хостах. По этой причине вы не можете смонтировать каталог хоста из Dockerfile. Инструкция **VOLUME** не поддерживает указание `host-dir` параметра. Вы должны указать точку монтирования при создании или запуске контейнера. ## Инструкция USER