Docker может автоматически создавать образы, читая инструкции из файла Dockerfile. Dockerfile — это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа. Его имя записывается именно так — без расширения.
На этой странице описаны команды, которые вы можете использовать в Dockerfile.
При запуске команды docker build для создания нового образа подразумевается, что Dockerfile находится в текущей рабочей директории. Если этот файл находится в каком-то другом месте, его расположение можно указать с использованием флага -f. Создадим простой Dockerfile:
FROM ubuntu:20.04 RUN apt-get update && apt-get install -y wget curl nano WORKDIR /root/docker COPY myfile myfile
И создадим новый образ с именем и тегом custom_ubuntu:1
docker build -t custom_ubuntu:1 .
Dockerfile все открывается инструкцией FROM с указанием родительского образа.
Далее зачастую пишутся команды RUN, поскольку каждая инструкция RUN создает новый слой. Хорошей практикой считается писать конвейеры логически связанных команд в одной инструкции RUN. Например, мы поместили команды обновления пакетов apt, установку нескольких утилит в одну инструкцию. Для комбинирования команд используется логический оператор «И», обозначающийся как &&.
Инструкция WORKDIR устанавливает рабочую директорию контейнера. Все последующие команды, работающие с привязками к директории, такие как COPY, RUN, CMD, ENTRYPOINT будут выполняться исходя из установленной директории. Например, в команде COPY, нашего примера, второй аргумент в действительности выглядит так
COPY myfile /root/docker/myfile
Проверим создался новый образ или нет командой docker images:
REPOSITORY TAG IMAGE ID CREATED SIZE custom_ubuntu 1 af08e52086b9 4 minutes ago 72.8MB
Запустим образ и проверим отработала ли WORKDIR из Dockerfile, да как видим pwd выдало правильный путь
docker run --rm -it custom_ubuntu:1 root@3cc16903b955:~/docker# pwd /root/docker
docker history custom_ubuntu:1 позволяет увидеть что происходило при сборке вашего образа.
Все инструкции описаны в официальной документации Dockerfile reference.
Инструкция | Описание | Пример использования | Комментарий |
---|---|---|---|
FROM | Задает базовый образ. Все последующие инструкции создают слои поверх родительского образа. | FROM python:latest FROM debian:wheezy | Быстрее всего можно найти образ с нужным тегом на Docker hub. |
RUN | Выполняет команду внутри контейнера и сохраняет результат. | RUN mkdir /usr/src/app/ RUN apt-get update && apt-get install python3-pip -y" | RUN может исполнять конвейер команд с логическими операторами && || |
COPY | Копирует файлы и папки из текущей директории, где находится пользователь в указанную директорию в контейнере. Если файл нужно скачать по ссылке или распаковать архив используйте ADD. | COPY . /usr/src/app/ | COPY считывает позицию пользователя на хосте, поэтому первым аргументом идет «.». |
ADD | Копирует файлы и папки из текущей позиции пользователя, скачивает файлы по URL и работает с tar-архивами." | ADD https://wiki.dieg.info/_media/winmtr.zip /usr/src/app/ | Официальная документация не рекомендует применять ADD. Для скачивания по URL можно использовать RUN с CURL или WGET, а для копирования — COPY. |
CMD | Выполняет команду с указанными аргументами во время запуска контейнера. | CMD ["python","web_interface.py"] | CMD должна быть одна в конце Dockerfile. CMD может вызывать исполняемый файл — .sh Аргументы docker run переопределяют CMD. Базовое поведение CMD дополнять инструкцию ENTRYPOINT. CMD всегда пишется после ENTRYPOINT. |
ENTRYPOINT | Похожа на CMD. Инструкции ENTRYPOINT и CMD могут быть переопределены с помощью флагов командной строки. | ENTRYPOINT ["python", "web_interface.py"] | ENTRYPOINT может использоваться совместно с CMD. |
ENV | Задает переменные среды внутри образа, на которые могут ссылаться другие инструкции. | ENV ADMIN="darkfire" Также можно передать переменную окружения TOKEN при запуске контейнера, используя ключ e docker run --rm -it -e TOKEN=abc ubuntu/entry или ключ –env-file - записывает в переменные окружения все данные из файла | ENV часто применяется для передачи информации в контейнеризированное приложение через переменные среды. |
ARG | Задает переменные, значение которых передается докером во время сборки образа. | ARG maintainer=darkfire
| В отличие от ENV-переменных, ARG-переменные недоступны во время выполнения контейнера. |
WORKDIR | Устанавливает рабочую директорию внутри контейнера. | WORKDIR /usr/src/app/ | Последующие инструкции CMD, RUN, ENTRYPOINT наследуют привязку к директории установленной WORKDIR. |
VOLUME | Создает и подключает постоянный том хранения данных. | VOLUME /data_cont_1
| Просмотреть существующие тома можно командой docker volume ls. К контейнеру можно подключить существующий том, для этого достаточно указать уже существующий том. |
EXPOSE | Инструкция, которая позволяет сообщить пользователю, какой(ие) порт(ы) слушает приложение внутри контейнера. Инструкция сама по себе не прокидывает порты на хост. Чтобы использовался указанный в EXPOSE порт — нужно указать docker run -P при запуске контейнера. | EXPOSE 5000
| Если требуется пробросить и сопоставить разные порты внутри и снаружи контейнера используется docker run -p порт на хосте: порт в контейнере docker run -d -p 81:80 --name httpd-container httpd Эта команда запускает Docker-контейнер httpd (HTTP-сервер Apache) и маппинг 81 порта хоста с 80 портом внутри Docker-контейнера. Подробнее в статье Проброс портов или маппинг портов |
LABEL | maintainer="darkfire@dieg.info" | Обычно содержит информацию об авторе образа |
Используйте ENTRYPOINT, если вы не хотите, чтобы пользователь вашего образа изменял исполняемый файл, который запускается при запуске контейнера. Используйте CMD, если записываете команду (исполняемый файл) по умолчанию, которую пользователь с лёгкостью может переопределить на этапе запуска контейнера. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг –entrypoint. Подробнее в официальной документации Понимание взаимодействия CMD и ENTRYPOINT.
LABEL добавляет метаданные в образ и обычно содержит информацию об авторе образа.
LABEL maintainer="darkfire@dieg.info"
Docker Cache: Как сделать чистую пересборку образа, Запрет кеширования (3 способа): Использования ARG для отключения кеширования
Docker Cache: Как сделать чистую пересборку образа, Запрет кеширования (3 способа): Использования ADD для отключения кеширования
Заходишь на хост где запущены контейнеры и этот радует, что хотя бы это получилось Задача нужно посмотреть как контейнер собирался то есть нужен Dockerfile. Пробуем искать по всему жесткому диску:
find / -name Dockerfile