Dockerfile - это текстовый файл, который содержит набор инструкций для автоматизации процесса создания Docker-образов. Dockerfile используется для описания структуры и конфигурации контейнера.
Вот некоторые основные директивы Dockerfile:
FROM:
Определяет базовый образ, на основе которого будет создан новый образ. Эта директива должна быть первой в Dockerfile.
FROM ubuntu:18.04
MAINTAINER:
Указывает имя и контактную информацию лица, ответственного за образ.
MAINTAINER John Doe <john.doe@example.com>
RUN:
Выполняет команду внутри контейнера во время создания образа.
RUN apt-get update && apt-get install -y curl
COPY и ADD:
Копируют файлы и директории из файловой системы хоста в контейнер. Разница между ними в том, что ADD позволяет автоматически распаковывать архивы и имеет дополнительные возможности.
COPY app.py /app/
ADD https://example.com/file.txt /app/
WORKDIR:
Устанавливает рабочий каталог для любых последующих инструкций RUN, CMD, ENTRYPOINT, COPY и ADD.
WORKDIR /app
EXPOSE:
Инструкция EXPOSE фактически не открывает порт. Она функционирует как своего рода документация между человеком, создающим образ, и человеком, запускающим контейнер, и говорит о том, какие порты предполагается публиковать.
EXPOSE 8080
ENTRYPOINT и CMD:
это две разные директивы в Dockerfile, которые используются для определения команды, которая будет выполняться при запуске контейнера. Однако есть некоторые различия в их поведении и применении.
ENTRYPOINT:
- Определяет исполняемый файл, который будет выполняться при запуске контейнера.
- Позволяет передавать аргументы командной строки при запуске контейнера.
- Аргументы, переданные при запуске контейнера, добавляются в конце команды, указанной в ENTRYPOINT.
ENTRYPOINT ["python", "app.py"]
В этом примере, при запуске контейнера команда python app.py
будет выполнена. Можно передать аргументы командной строки, например:
docker run my-image arg1 arg2
В этом случае команда, выполняемая контейнером, будет: python app.py arg1 arg2
.
CMD:
- Устанавливает команду по умолчанию, которая будет выполнена при запуске контейнера.
- Может быть переопределена при запуске контейнера с помощью аргументов командной строки.
Пример использования CMD:
CMD ["python", "app.py"]
В этом примере, если при запуске контейнера не указывается другая команда, то будет выполнена команда python app.py
. Однако, если при запуске контейнера указана другая команда, она заменит команду, указанную в CMD.
Пример запуска контейнера с другой командой:
docker run my-image python script.py
В этом случае команда python script.py
заменит команду, указанную в CMD.
Теперь давайте рассмотрим некоторые ситуации, когда лучше использовать ENTRYPOINT или CMD:
ENTRYPOINT применяется, когда вы хотите, чтобы контейнер всегда выполнял определенную команду, и вы
хотите предоставить возможность передавать аргументы при запуске контейнера. Например, если вы хотите
создать контейнер, который всегда запускает сервер приложения с определенными настройками, но вам
нужно иметь возможность изменять порт или другие параметры при запуске.
CMD используется, когда вы хотите задать команду по умолчанию для контейнера, но также хотите иметь
возможность переопределить ее при запуске контейнера. Это полезно, когда вы создаете образ, который
должен запускать определенную команду по умолчанию
ARG и ENV:
В Docker существуют два различных механизма для передачи переменных внутрь контейнера: ARG (аргументы сборки) и ENV (переменные окружения). Оба механизма предоставляют способы настройки и передачи значений переменных во время создания и выполнения контейнера. Вот подробное объяснение каждого из них с примерами:
ARG (аргументы сборки):
ARG используется для передачи переменных во время сборки образа контейнера.
Переменные ARG задаются в файле Dockerfile и доступны только на этапе сборки образа.
Они могут быть использованы для передачи информации, например, версии приложения или URL источника.
Переменные ARG могут быть использованы в командах RUN, COPY, ADD, ENV, LABEL и т.д.
Пример использования ARG в Dockerfile:
ARG VERSION=latest
ENV APP_VERSION=$VERSION
RUN echo "Building version $VERSION"
Пример сборки образа с заданным значением переменной ARG:
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
В этом примере переменная VERSION задается во время сборки образа и используется в команде RUN для вывода сообщения о версии.
ENV (переменные окружения):
ENV используется для установки переменных окружения в контейнере на этапе выполнения.
Переменные ENV могут быть заданы в файле Dockerfile или переданы через команду docker run с опцией -e или --env.
Они могут использоваться внутри контейнера программами и скриптами для доступа к определенным значениям.
Пример использования ENV в Dockerfile:
ENV DB_HOST=localhost
ENV DB_PORT=5432
Пример запуска контейнера с передачей значений переменных ENV:
docker run -e DB_HOST=database -e DB_PORT=5432 myapp
В этом примере переменные окружения DB_HOST и DB_PORT передаются контейнеру с помощью опции -e и задаются значениями database и 5432 соответственно.
Оба механизма, ARG и ENV, предоставляют гибкость в настройке контейнеров и передаче переменных внутрь них. ARG предназначен для передачи переменных на этапе сборки образа, в то время как ENV используется для передачи переменных