Что такое Dockerfile и как его использовать
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 с примерами команд и опций
Все инструкции описаны в официальной документации 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
Зачем нужен Entrypoint?
Используйте ENTRYPOINT, если вы не хотите, чтобы пользователь вашего образа изменял исполняемый файл, который запускается при запуске контейнера. Используйте CMD, если записываете команду (исполняемый файл) по умолчанию, которую пользователь с лёгкостью может переопределить на этапе запуска контейнера. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг –entrypoint. Подробнее в официальной документации Понимание взаимодействия CMD и ENTRYPOINT.
LABEL
LABEL добавляет метаданные в образ и обычно содержит информацию об авторе образа.
LABEL maintainer="darkfire@dieg.info"
ARG
Docker Cache: Как сделать чистую пересборку образа, Запрет кеширования (3 способа): Использования ARG для отключения кеширования
ADD
Docker Cache: Как сделать чистую пересборку образа, Запрет кеширования (3 способа): Использования ADD для отключения кеширования
Как найти запущенного контейнера
Заходишь на хост где запущены контейнеры и этот радует, что хотя бы это получилось Задача нужно посмотреть как контейнер собирался то есть нужен Dockerfile. Пробуем искать по всему жесткому диску:
find / -name Dockerfile
Заключение
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!
7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах