Команды Dockerfile
Dockerfile — это конфигурационный файл, в котором описаны инструкции, которые будут применены при сборке Docker-образа и запуске контейнера. Dockerfile создается в корневой директории проекта и не имеет расширения. Синтаксис Dockerfile близок к синтаксису конфигурационных файлов .ini. На каждую строчку приходится одна инструкция. Инструкции пишутся капсом, а их значения отделяются пробелом.
Dockerfile имеет следующую логику заполнения:
- Первой инструкцией всегда идёт FROM с указанием родительского образа. Например, FROM python:latest.
- Инструкция RUN может принимать конвейер команд Linux, чтобы не создавать лишние слои. Например, RUN apt-get update && apt-get install python3-pip -y && pip install --upgrade pip && pip install pipenv.
- Инструкция WORKDIR устанавливает рабочий каталог контейнера. Например, WORKDIR /usr/src/app/. Последующие команды RUN, CMD, ENTRYPOINT наследуют привязку WORKDIR.
- Завершающей инструкцией всегда идёт CMD. Например, CMD ["python", "web_interface.py"]. CMD наследует привязку к WORKDIR, поэтому web_interface.py будет запущен из папки /usr/src/app/.
Инструкция | Описание | Пример использования | Комментарий |
---|---|---|---|
FROM | Задает базовый образ. Все последующие инструкции создают слои поверх родительского образа. | FROM openjdk:21 |
Быстрее всего можно найти образ с нужным тегом на Docker hub. |
RUN | Выполняет команду внутри контейнера и сохраняет результат. | RUN mkdir /usr/src/app/ RUN apt-get update && apt-get install python3-pip -y |
RUN может исполнять конвейер команд с логическими операторами && и ||. |
COPY | Копирует файлы и папки из текущей директории, где находится пользователь в указанную директорию в контейнере | COPY target/kafkaDevOpsTask3-1.0-SNAPSHOT.jar app.jar |
COPY считывает позицию пользователя на хосте, поэтому первым аргументом идет «.». |
ADD | Копирует файлы и папки из текущей позиции пользователя, скачивает файлы по URL и работает с tar-архивами. | ADD https://url/config.ini /usr/src/app/ |
Официальная документация не рекомендует применять ADD. Для скачивания по URL можно использовать RUN с CURL или WGET, а для копирования — COPY. |
CMD | Выполняет команду с указанными аргументами во время запуска контейнера. | CMD ["python", "web_interface.py"] |
CMD должна быть одна в конце Dockerfile. CMD может вызывать исполняемый файл — .sh. Аргументы docker run переопределяют CMD. Если в Dockerfile нет CMD, обязательно должна быть инструкция ENTRYPOINT. |
ENTRYPOINT | Похожа на CMD, но при запуске контейнера не переопределяется в отличие от CMD. | ENTRYPOINT ["java", "-jar", "/app.jar"] |
ENTRYPOINT может использоваться совместно с CMD. |
ENV | Задает переменные среды внутри образа, на которые могут ссылаться другие инструкции. | ENV ADMIN="savenkoffcom" |
ENV часто применяется для передачи информации в контейнеризированное приложение через переменные среды. |
ARG | Задает переменные, значение которых передается докером во время сборки образа. | ARG maintainer=savenkoffcom |
В отличие от 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 внутренний порт:внешний порт |
LABEL | Добавляет метаданные в образ. | LABEL org.opencontainers.image.authors="savenkoffcom" |
Обычно LABEL содержит информацию об авторе образа. |
MAINTAINER | Указывает автора образа | MAINTAINER savenkoffcom |
Инструкция MAINTAINER , которая исторически использовалась для указания автора Dockerfile, устарела. Чтобы задать метаданные автора для образа, используйте org.opencontainers.image.authors метку LABEL . |