Автоматическая сборка образов Docker с помощью Dockerfile
Контейнеры Docker создаются на основе образов. Образ может содержать что угодно: от основных компонентов операционной системы до сложнейшего стека приложений, готового к запуску.
При сборке образов с помощью Docker любое действие (выполненная команда) формирует новый уровень поверх предыдущего.
Данная статья поможет автоматизировать процесс сборки образа с помощью Dockerfile.
Dockerfile – это подробный пошаговый сценарий для автоматизации сборки.
Краткий обзор Docker
Проект Docker предлагает качественные инструменты на основе некоторых функций ядра Linux, которые можно использовать в связке. Цель проекта – помочь разработчикам и системным администраторам быстро портировать и запускать приложения со всеми зависимостями.
Для этого Docker создаёт надёжное окружение на основе LXC (Linux Containers), которое называется контейнером. Такие контейнеры создаются на основе образов. Образы собираются вручную (с помощью набора команд) или автоматически (при помощи Dockerfiles).
Читайте также:
Что такое Dockerfile?
Dockerfile – это сценарий, который состоит из последовательности команд и аргументов, необходимых для создания образа. Такие сценарии упрощают развёртывание и процесс подготовки приложения к запуску.
Сначала Dockerfile определяет образ, на основе которого будет происходить сборка. Затем идёт ряд методов, команд и аргументов, которые создадут новый образ.
Содержимое Dockerfile передаётся демону Docker для сборки образа.
Синтаксис Dockerfile
Прежде чем начать разработку Dockerfile, нужно ознакомиться с синтаксисом этого файла.
Примечание: Синтаксис – это структура, согласно которой нужно организовывать команды, аргументы и другие компоненты кода для выполнения той или иной процедуры. Такие структуры основываются на чётко обозначенных правилах, которым должно следовать каждое приложение и программа. Если в сценарии правила не соблюдены, такой сценарий не будет работать должным образом. Каждый сценарий имеет свое предназначение, и поэтому при обработке программа должна понимать, что значит его содержимое.
Синтаксис сценариев Dockerfile довольно прост и понятен.
Пример синтаксиса Dockerfile
Синтаксис Dockerfile состоит из двух основных блоков:
- комментарии и команды;
- аргументы.
# Line blocks used for commenting
command argument argument ..
# Print «Hello docker!»
RUN echo «Hello docker!»
Команды Dockerfile
Dockerfile поддерживает огромное количество команд для сборки образов. Рассмотрим основные команды.
Примечание: Как говорилось ранее, все команды в файле Dockerfile нужно упорядочить по мере их выполнения. Однако некоторые команды (например, MAINTAINER) могут находиться в любом месте файла (но всегда после команды FROM).
Команда ADD
Команда ADD имеет два аргумента: источник и назначение. Команда копирует исходный файл в целевой каталог файловой системы контейнера. Если в источнике указан URL-адрес, команда загрузит его содержимое. Например:
# Usage: ADD [destination directory] ADD /my_app_folder /my_app_folder
Команда CMD
CMD, аналогично команде RUN, можно использовать для запуска других команд. В отличие от RUN, эту команду нельзя использовать при сборке, она выполняет команду при запуске контейнера
К примеру, команда CMD может запустить приложение во время создания контейнера, установленного с помощью RUN. Команда CMD будет командой по умолчанию и заменит любую другую команду, запущенную во время создания.
# Usage 1: CMD application «argument», «argument», ..
CMD «echo» «Hello docker!»
Аргумент ENTRYPOINT
ENTRYPOINT задаёт приложение по умолчанию, которое используется во время создания контейнера. К примеру, если образ предназначен только для запуска определённого приложения, это приложение можно обозначить в ENTRYPOINT.
Аргумент ENTRYPOINT можно использовать с командой CMD.
# Usage: ENTRYPOINT application «argument», «argument», ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD «Hello docker!»
ENTRYPOINT echo
Команда ENV
Команда ENV задаёт переменные среды в формате «ключ = значение», которые в дальнейшем можно использовать в сценариях и приложениях внутри контейнера. ENV обеспечивает гибкость запуска команд.
# Usage: ENV key value
ENV SERVER_WORKS 4
Команда EXPOSE
Команда EXPOSE задаёт порт, с помощью которого приложение в контейнере может взаимодействовать с внешним миром.
# Usage: EXPOSE [port] EXPOSE 8080
Команда FROM
FROM – пожалуй, одна из самых важных команд Dockerfile. Она определяет базовый образ, на основе которого будет собран новый образ. В качестве базового можно использовать любой доступный образ, включая созданные ранее. Если указанный образ не найден, Docker попытается найти и загрузить его из индекса образов. С этой команды должен начинаться Dockerfile.
# Usage: FROM [image name] FROM ubuntu
Команда MAINTAINER
Одна из команд, которые можно поместить в любую точку сценария (хотя рекомендуется всё же указывать её в начале). Эта команда не выполняется, она позволяет задать имя автора. Она всегда должна идти после FROM.
# Usage: MAINTAINER [name] MAINTAINER authors_name
Команда RUN
RUN – основная команда Dockerfile для запуска других команд. Она запускает указанную команду внутри контейнера с учётом всех аргументов. В отличие от CMD, её можно использовать для сборки образа (формирования нового уровня).
# Usage: RUN [command] RUN aptitude install -y riak
Директива USER
Эта директива задаёт имя пользователя (или UID), с помощью которого нужно запустить контейнер.
# Usage: USER [UID] USER 751
Команда VOLUME
VOLUME разрешает контейнеру доступ к заданному каталогу на локальной машине.
# Usage: VOLUME [«/dir_1», «/dir_2» ..] VOLUME [«/my_files»]
Директива WORKDIR
WORKDIR устанавливает рабочий каталог, в котором будет выполнена команда, указанная в CMD.
# Usage: WORKDIR /path
WORKDIR
Использование Dockerfile
Использовать Dockerfile не сложнее, чем демон Docker. После запуска сценарий выведет ID нового образа.
# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build -t my_mongodb .
Пример Dockerfile: образ для установки MongoDB
Теперь попробуйте создать Dockerfile и добавить в него пошаговые инструкции по установке MongoDB.
Примечание: Все нижеприведённые команды и аргументы нужно добавить в Dockerfile последовательно. В конце руководства можно найти полный код файла.
Создайте Dockerfile с помощью текстового редактора:
sudo nano Dockerfile
Определите цель файла. Это опционально, но очень полезно: так вы можете сообщить другим, для чего будет предназначен данный образ. К примеру, в начало файла можно поместить такой комментарий:
Задайте базовый образ:
# Set the base image to Ubuntu
FROM ubuntu
Укажите его автора:
# File Author / Maintainer
MAINTAINER Example McAuthor
Обновите список репозитория приложения.
# Update the repository sources list
RUN apt-get update
Задайте команды и аргументы для загрузки MongoDB:
################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv —keyserver hkp://keyserver.ubuntu.com:80 —recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen’ | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
Затем укажите порт по умолчанию:
# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD [«—port 27017»] # Set default container command
ENTRYPOINT usr/bin/mongod
Сохраните Dockerfile, добавив в него всё необходимое. Для этого нажмите CTRL+X и Y.
В результате файл должен выглядеть так:
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER Example McAuthor
# Update the repository sources list
RUN apt-get update
################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv —keyserver hkp://keyserver.ubuntu.com:80 —recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen’ | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD [«—port 27017»] # Set default container command
ENTRYPOINT usr/bin/mongod
Теперь можно собрать образ MongoDB с помощью этого сценария.
sudo docker build -t my_mongodb .
Примечание: Флаг -t [name] задаёт название образа. Чтобы получить справку по сборке, введите команду:
sudo docker build —help
Запуск MongoDB
С помощью образа MongoDB можно создать контейнер.
Примечание: Чтобы задать имя контейнера, добавьте флаг -name [].
sudo docker run -name my_first_mdb_instance -i -t my_mongodb
Если при запуске контейнера вы не укажете его имя, docker присвоит ему сложный алфавитно-цифровой ID. Его можно узнать с помощью команды:
Entrypoint что это
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Dockerfile и коммуникация между контейнерами
В прошлой статье мы рассказали, что такое Docker и как с его помощью можно обойти Vendor–lock. В этой статье мы поговорим о Dockerfile как о правильном способе подготовки образов для Docker. Также мы рассмотрим ситуацию, когда контейнерам нужно взаимодействовать друг с другом.
В InfoboxCloud мы сделали готовый образ Ubuntu 14.04 с Docker. Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker.
Dockerfile
Подход docker commit, описанный в предыдущей статье, не является рекомендованным для Docker. Его плюс состоит в том, что мы настраиваем контейнер практически так, как привыкли настраивать стандартный сервер.
Вместо этого подхода мы рекомендуем использовать подход Dockerfile и команду docker build. Dockerfile использует обычный DSL с инструкциями для построения образов Docker. После этого выполняется команда docker build для построения нового образа с инструкциями в Dockerfile.
Написание Dockerfile
Давайте создадим простой образ с веб-сервером с помощью Dockerfile. Для начала создадим директорию и сам Dockerfile.
Созданная директория — билд-окружение, в которой Docker вызывает контекст или строит контекст. Docker загрузит контекст в папке в процессе работы Docker–демона, когда будет запущена сборка образа. Таким образом будет возможно для Docker–демона получить доступ к любому коду, файлам или другим данным, которые вы захотите включить в образ.
Добавим в Dockerfile информацию по построению образа:
Dockerfile содержит набор инструкций с аргументами. Каждая инструкция пишется заглавными буквами (например FROM). Инструкции обрабатываются сверху вниз. Каждая инструкция добавляет новый слой в образ и коммитит изменения. Docker исполняет инструкции, следуя процессу:
- Запуск контейнера из образа
- Исполнение инструкции и внесение изменений в контейнер
- Запуск эквивалента docker commit для записи изменений в новый слой образа
- Запуск нового контейнера из нового образа
- Исполнение следующей инструкции в файле и повторение шагов процесса.
Это означает, что если исполнение Dockerfile остановится по какой-то причине (например инструкция не сможет завершиться), вы сможете использовать образ до этой стадии. Это очень полезно при отладке: вы можете запустить контейнер из образа интерактивно и узнать, почему инструкция не выполнилась, используя последний созданный образ.
Также Dockerfile поддерживает комментарии. Любая строчка, начинающаяся с # означает комментарий.
Первая инструкция в Dockerfile всегда должна быть FROM, указывающая, из какого образа нужно построить образ. В нашем примере мы строим образ из базового образа ubuntu версии 14:04.
Далее мы указываем инструкцию MAINTAINER, сообщающую Docker автора образа и его email. Это полезно, чтобы пользователи образа могли связаться с автором при необходимости.
Инструкция RUN исполняет команду в конкретном образе. В нашем примере с помощью ее мы обновляем APT репозитории и устанавливаем пакет с NGINX, затем создаем файл /usr/share/nginx/html/index.html.
По-умолчанию инструкция RUN исполняется внутри оболочки с использованием обертки команд /bin/sh -c. Если вы запускаете инструкцию на платформе без оболочки или просто хотите выполнить инструкцию без оболочки, вы можете указать формат исполнения:
Мы используем этот формат для указания массива, содержащего команду для исполнения и параметры команды.
Далее мы указываем инструкцию EXPOSE, которая говорит Docker, что приложение в контейнере должно использовать определенный порт в контейнере. Это не означает, что вы можете автоматически получать доступ к сервису, запущенному на порту контейнера (в нашем примере порт 80). По соображениям безопасности Docker не открывает порт автоматически, но ожидает, когда это сделает пользователь в команде docker run. Вы можете указать множество инструкций EXPOSE для указания, какие порты должны быть открыты. Также инструкция EXPOSE полезна для проброса портов между контейнерами.
Строим образ из нашего файла
, где trukhinyuri – название репозитория, где будет храниться образ, nginx – имя образа. Последний параметр — путь к папке с Dockerfile. Если вы не укажете название образа, он автоматически получит название latest. Также вы можете указать git репозиторий, где находится Dockerfile.
В данном примере мы строим образ из Dockerfile, расположенном в корневой директории Docker.
Если в корне билд контекста есть файл .dockerignore – он интерпретируется как список паттернов исключений.
Что произойдет, если инструкция не исполнится?
Давайте переименуем в Dockerfile nginx в ngin и посмотрим.

Мы можем создать контейнер из предпоследнего шага с ID образа 066b799ea548
docker run -i -t 066b799ea548 /bin/bash
и отладить исполнение.
По-умолчанию Docker кеширует каждый шаг и формируя кеш сборок. Чтобы отключить кеш, например для использования последнего apt-get update, используйте флаг —no-cache.
Использования кеша сборок для шаблонизации
Используя кеш сборок можно строить образы из Dockerfile в форме простых шаблонов. Например шаблон для обновления APT-кеша в Ubuntu:
Инструкция ENV устанавливает переменные окружения в образе. В данном случае мы указываем, когда шаблон был обновлен. Когда необходимо обновить построенный образ, просто нужно изменить дату в ENV. Docker сбросит кеш и версии пакетов в образе будут последними.
Инструкции Dockerfile
Давайте рассмотрим и другие инструкции Dockerfile. Полный список можно посмотреть тут.
CMD
Инструкция CMD указывает, какую команду необходимо запустить, когда контейнер запущен. В отличие от команды RUN указанная команда исполняется не во время построения образа, а во время запуска контейнера.
В данном случае мы запускаем bash и передаем ему параметр в виде массива. Если мы задаем команду не в виде массива — она будет исполняться в /bin/sh -c. Важно помнить, что вы можете перегрузить команду CMD, используя docker run.
ENTRYPOINT
Часто команду CMD путают с ENTRYPOINT. Разница в том, что вы не можете перегружать ENTRYPOINT при запуске контейнера.
При запуске контейнера параметры передаются команде, указанной в ENTRYPOINT.
Можно комбинировать ENTRYPOINT и CMD.
В этом случае команда в ENTRYPOINT выполнится в любом случае, а команда в CMD выполнится, если не передано другой команды при запуске контейнера. Если требуется, вы все-таки можете перегрузить команду ENTRYPOINT с помощью флага —entrypoint.
WORKDIR
С помощью WORKDIR можно установить рабочую директорию, откуда будут запускаться команды ENTRYPOINT и CMD.
Вы можете перегрузить рабочую директорию контейнера в рантайме с помощью флага -w.
USER
Специфицирует пользователя, под которым должен быть запущен образ. Мы можем указать имя пользователя или UID и группу или GID.
Вы можете перегрузить эту команду, используя глаг -u при запуске контейнера. Если пользователь не указан, используется root по-умолчанию.
VOLUME
Инструкция VOLUME добавляет тома в образ. Том — папка в одном или более контейнерах или папка хоста, проброшенная через Union File System (UFS).
Тома могут быть расшарены или повторно использованы между контейнерами. Это позволяет добавлять и изменять данные без коммита в образ.
В примере выше создается точка монтирования /opt/project для любого контейнера, созданного из образа. Таким образом вы можете указывать и несколько томов в массиве.
ADD
Инструкция ADD добавляет файлы или папки из нашего билд-окружения в образ, что полезно например при установке приложения.
Источником может быть URL, имя файла или директория.
В последнем примере архив tar.gz будет распакован в /var/www/wordpress. Если путь назначения не указан — будет использован полный путь включая директории.
COPY
Инструкция COPY отличается от ADD тем, что предназначена для копирования локальных файлов из билд-контекста и не поддерживает распаковки файлов:
ONBUILD
Инструкция ONBUILD добавляет триггеры в образы. Триггер исполняется, когда образ используется как базовый для другого образа, например, когда исходный код, нужный для образа еще не доступен, но требует для работы конкретного окружения.
Коммуникация между контейнерами
В предыдущей статье было показано, как запускать изолированные контейнеры Docker и как пробрасывать файловую систему в них. Но что, если приложениям нужно связываться друг с другом. Есть 2 способа: связь через проброс портов и линковку контейнеров.
Проброс портов
Такой способ связи уже был показан ранее. Посмотрим на варианты проброса портов чуть шире.
Когда мы используем EXPOSE в Dockerfile или параметр -p номер_порта – порт контейнера привязывается к произвольному порту хоста. Посмотреть этот порт можно командой docker ps или docker port имя_контейнера номер_порта_в_контейнере. В момент создания образа мы можем не знать, какой порт будет свободен на машине в момент запуска контейнера.
Указать, на какой конкретный порт хоста мы привяжем порт контейнера можно параметром docker run -p порт_хоста: порт_контейнера
По-умолчанию порт используется на всех интерфейсах машины. Можно, например, привязать к localhost явно:
Можно привязать UDP порты, указав /udp:
Линковка контейнеров
Связь через сетевые порты — лишь один способ коммуникации. Docker предоставляет систему линковки, позволяющую связать множество контейнеров вместе и отправлять информацию о соединении от одного контейнера другому.
Для установки связи нужно использовать имена контейнеров. Как было показано ранее, вы можете дать имя контейнеру при создании с помощью флага —name.
Допустим у вас есть 2 контейнера: web и db. Чтобы создать связь, удалите контейнер web и пересоздайте с использованием команды —link name:alias.
Используя docker -ps можно увидеть связанные контейнеры.
Что на самом деле происходит при линковке? Создается контейнер, который предоставляет информацию о себе контейнеру-получателю. Это происходит двумя способами:
- Через переменные окружения
- Через /etc/hosts
Переменные окружения можно посмотреть, выполнив команду env:
Префикс DB_ был взят из alias контейнера.
Можно просто использовать информацию из hosts, например команда ping db (где db – alias) будет работать.
Начало работы с Docker. Часть вторая
Dockerfile — конфигурационный файл, описывающий пошаговое создание среды для работы приложения. В этом файле подробно описывается какие образы задействованы, какие команды будут выполнены и какие настройки будут применены. А движок Docker-а при запуске уже прочитает этот файл и создаст соответствующий образ.
Создадим директорию app в домашнем каталоге и разместим в нем два файла — script.php и Dockerfile :
Эти инструкции означают:
- FROM — использовать образ с предустановленным php:7.2-cli ( имя:тег )
- COPY — копировать файл script.php из основной системы внутрь контейнера
- RUN — выполнить shell-команду в терминале контейнера (сделать скрипт исполняемым)
- CMD — выполнять эту shell-команду каждый раз при запуске контейнера
Теперь создадим образ из Dockerfile :
Эта команда создает образы из Dockerfile и «контекста». Контекст сборки — это набор файлов, расположенных по указанному пути или URL. Процесс создания образа может ссылаться на любой из файлов в контексте. Например, инструкция COPY будет искать файл по указанному пути. Мы используем точку, чтобы сообщить, что все файлы расположены в текущей директории. А опция —tag позволяет задать имя образа (можно задать в виде имя:тег ).
Посмотрим список образов, сохраненных локально:
Теперь все готово к запуску нового контейнера:
При запуске контейнера можно указать дополнительные опции, например
Наш php-скрипт был успешно скопирован, и выполнен благодаря указанной в Dockerfile инструкции CMD . Давайте проверим, что скрипт действительно был скопирован внутрь контейнера:
Однако, сейчас этот контейнер недостаточно гибкий. Хотелось бы иметь возможность передать нашему скрипту аргументы, чтобы можно было изменять размер пирамиды.
Но, было бы неплохо передавать этот аргумент самому контейнеру, вместо переписывания всей команды.
Теперь аргументы инструкции CMD будут добавлены к аргументам инструкции ENTRYPOINT и получится
Соберем образ заново, запустим контейнер и предадим ему аргумент:
Основные инструкции Dockerfile
Для начала посмотрим на список инструкций Dockerfile с краткими комментариями, а потом разберем их подробнее:
- FROM — задаёт базовый (родительский) образ
- LABEL — описывает метаданные (например, кто создал образ)
- ENV — устанавливает постоянные переменные среды
- RUN — выполняет команду и создаёт слой образа
- COPY — копирует в контейнер файлы и директории
- ADD — копирует файлы и папки в контейнер, может распаковывать .tar-файлы
- CMD — описывает команду с аргументами, которая выполняется при запуске контейнера
- WORKDIR — задаёт рабочую директорию для следующей инструкции
- ARG — задаёт переменные для передачи Docker во время сборки образа
- ENTRYPOINT — задает команду с аргументами для вызова во время выполнения контейнера
- EXPOSE — указывает на необходимость открыть порт
- VOLUME — создаёт точку монтирования для работы с постоянным хранилищем
1. Инструкция FROM сообщает Docker о том, чтобы при сборке образа использовался базовый образ, который соответствует предоставленному имени и тегу. Базовый образ, кроме того, ещё называют родительским образом.
2. Инструкция LABEL (метка) позволяет добавлять в образ метаданные. Как правило, она включает в себя контактные сведения создателя образа.
3. Инструкция ENV позволяет задавать постоянные переменные среды, которые будут доступны в контейнере во время его выполнения. Хорошо подходит для задания констант. Если некое значение используется несколько раз, имеет смысл записать его в константу.
4. Инструкция RUN позволяет создать слой во время сборки образа. После её выполнения в образ добавляется новый слой, его состояние фиксируется. Инструкция RUN часто используется для установки в образы дополнительных пакетов.
Инструкция RUN и схожие с ней инструкции ( CMD и ENTRYPOINT ), могут быть использованы либо в exec-форме, либо в shell-форме. Exec-форма использует синтаксис, напоминающий описание JSON-массива:
5. Инструкция COPY позволяет копировать в образ файлы и директории. Если целевая директория не существует, она будет создана. Например, сообщим Docker о том, что нужно взять файлы и папки из локального контекста сборки и добавить их в рабочую директорию образа.
6. Инструкция ADD позволяет решать те же задачи, что и COPY , но с ней связана ещё пара вариантов использования. Так, с помощью этой инструкции можно добавлять в контейнер файлы, загруженные из удалённых источников, а также распаковывать локальные tar-файлы.
7. Инструкция CMD предоставляет Docker команду, которую нужно выполнить при запуске контейнера. Результаты выполнения этой команды не добавляются в образ во время его сборки. В одном файле Dockerfile может присутствовать лишь одна инструкция CMD .
Инструкция CMD может иметь exec-форму. Если в эту инструкцию не входит упоминание исполняемого файла, тогда в файле должна присутствовать инструкция ENTRYPOINT . В таком случае обе эти инструкции должны быть представлены в формате JSON.
8. Инструкция WORKDIR позволяет установить рабочую директорию, откуда будут запускаться команды ENTRYPOINT и CMD . Инструкция автоматически создаёт директорию в том случае, если она не существует. Кроме того, с помощью инструкции WORDDIR можно создать контекст для инструкции COPY :
9. Инструкция ARG позволяет задать переменную, значение которой можно передать из командной строки в образ во время его сборки. Значение для переменной по умолчанию можно представить в Dockerfile .
В отличие от ENV -переменных, ARG -переменные недоступны во время выполнения контейнера. Однако ARG -переменные можно использовать для задания значений по умолчанию для ENV -переменных из командной строки в процессе сборки образа. А ENV -переменные уже будут доступны в контейнере во время его выполнения.
10. Инструкция ENTRYPOINT позволяет задавать команду с аргументами, которая должна выполняться при запуске контейнера. Она похожа на команду CMD , но параметры, задаваемые в ENTRYPOINT , не перезаписываются в том случае, если контейнер запускают с параметрами командной строки. Вместо этого аргументы командной строки, передаваемые в конструкции вида docker run image param , добавляются к аргументам, задаваемым инструкцией ENTRYPOINT .
11. Инструкция EXPOSE указывает на то, какие порты нужно открыть для того, чтобы можно было связаться с работающим контейнером. Обратите внимание, что эта инструкция не открывает порты. Для того, чтобы открыть порт (или порты) и настроить перенаправление, нужно выполнить команду docker run с опцией -p . Если использовать ключ в виде -P (с заглавной буквой P ), то открыты будут все порты, указанные в инструкции EXPOSE .
12. Инструкция VOLUME устарела и использовать ее не рекомендуется.
Хранение данных в Docker
Данные в Docker могут храниться либо временно, либо постоянно.
1. Временное хранение данных
По умолчанию файлы, создаваемые приложением, работающим в контейнере, сохраняются в верхнем слое контейнера, поддерживающем запись. Для того чтобы этот механизм работал, ничего специально настраивать не нужно. Получается дёшево и сердито — приложению достаточно просто сохранить данные и продолжить заниматься своими делами. Однако после того как контейнер перестанет существовать, исчезнут и данные, сохранённые таким вот нехитрым способом.
2. Постоянное хранение данных
Самый простой способ — монтирование директории основной системы в Docker контейнер прямо при запуске:
Давайте запустим в работу контейнер с Ubuntu и смонтируем директорию
/share в директорию контейнера /mnt/share :
Теперь в основной системе, в директории
/share мы увидим файл test.txt . При удалении контейнера, все данные, которые он записывал в директорию /mnt/share останутся в директории
/share основной системы.
Второй способ постоянного хранения данных — использование Docker Volumes.