Dockerfile
CMD и ENTRYPOINT в Dockerfile
CMD
и ENTRYPOINT
инструкции Dockerfile
задают команду, исполняемую при запуске контейнера. При их использовании есть несколько правил, например:
Должна быть минимум одна из них, CMD
или ENTRYPOINT
, в Dockerfile. Если контейнер используется как исполняемый файл — ENTRYPOINT
должна быть определена. Если контейнер запускается с другими аргументами — CMD
будет переопределена.
FROM
— задаёт базовый (родительский) образ.LABEL
— описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.ENV
— устанавливает постоянные переменные среды.RUN
— вы полняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.COPY
— копирует в контейнер файлы и папки.ADD
— копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.CMD
— описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.WORKDIR
— задаёт рабочую директорию для следующей инструкции.ARG
— задаёт переменные для передачи Docker во время сборки образа.ENTRYPOINT
— предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.EXPOSE
— указывает на необходимость открыть порт.VOLUME
— создаёт точку монтирования для работы с постоянным хранилищем.
FROM python:3.9.7-alpine3.14
ENV PYTHONUNBUFFERED 1
LABEL VERSION="1.0.0"
LABEL MAINTAINER="Andrey Bondariev"
LABEL EMAIL="andreybond13@gmail.com"
LABEL NAME="Flask Web Application"
WORKDIR /FlaskWebApp
ADD main.py .
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY ./app ./app
EXPOSE 80
CMD [ "python3", "./main.py" ]
Установка для
PYTHONUNBUFFERED
непустого значения (1) гарантирует, что вывод Python, т. е. потокиstdout
иstderr
, отправляются прямо на терминал (например, лог контейнера) без предварительной буферизации, и что вы можете видеть вывод вашего приложения (например, логи Django) в реальном времени. время. Это также гарантирует, что частичный вывод не будет храниться где-то в буфере и никогда не будет записываться в случае сбоя приложения Python.PYTHONUNBUFFERED
абсолютно не влияет на ввод (то есть потокstdin
).