Dockerfile команды для создания docker образа

Основные инструкции для Dockerfile:

  • FROM — указывает базовый образ, на основе которого нужно создать новый
  • RUN — указывает, какие команды необходимо выполнить внутри контейнера во время сборки образа
  • COPY — копирует файлы и папки из текущей директории, где находится пользователь в указанную директорию в контейнере
  • WORKDIR — устанавливает рабочую директорию для последующих инструкций
  • CMD — определяет аргументы по умолчанию при запуске контейнера
  • ENTRYPOINT — команда, которая будет выполнена при запуске контейнера
  • ENV — задает переменные среды внутри образа, на которые могут ссылаться другие инструкции.
    пример: ENV ADMIN=»ivan»
  • ARG — задает переменные, значение которых передается докером во время сборки образа. в отличие от ENV-переменных, ARG-переменные недоступны во время выполнения контейнера.
    пример: ARG maintainer=ivan
  • EXPOSE — указывает планируемый рабочий порт у контейнера. Инструкция сама по себе не открывает порт. Чтобы использовался указанный в EXPOSE порт — нужно указать docker run -P при запуске контейнера.
    пример: EXPOSE 5000
  • LABEL — добавляет метаданные в образ. можно использовать для информации об авторе.

 

Пример Dockerfile для приложения на Python:

# Используем базовый образ с Python
FROM python:3.8

# Устанавливаем зависимости
RUN pip install flask

# Копируем исходный код в образ
COPY . /app

# Указываем рабочую директорию
WORKDIR /app

# Определяем команду для запуска приложения
CMD ["python", "app.py"]

пример сборки образа с явным указанием тега

docker build -t my-python-app:v1.0

Для отправки образа в реестр Docker Hub используются следующие команды:

docker tag my-python-app:v1.0 username/my-python-app:v1.0 && docker push username/my-python-app:v1.0

Загрузка образа из реестра выполняется командой:

docker pull username/my-python-app:v1.0

Образы Docker статичны. А вот контейнеры — изменяемы. Чтобы «обновить» образ, можно запустить из него контейнер, внести изменения и сохранить состояние в новый образ. Делается это с использованием команды <docker commit>:

docker commit -m "Добавлены изменения" -a "Автор" container_id username/my-python-app:v1.1

 

CMD и ENTRYPOINT принимают:

  • команду в виде shell:
    • CMD python web_interface.py
    • CMD php-fpm
  • команду в виде exec:
    • ENTRYPOINT [«init»]
    • CMD [«python», «web_interface.py»]

ENTRYPOINT запускается первым, затем выполняется CMD, но только если ENTRYPOINT запущен в виде exec (ENTRYPOINT [«init»])

К примеру при билде данного конфига:

FROM alpine  
ENTRYPOINT ls /usr
CMD ["/var"]

результат:

bin
lib
local
sbin
share

а в результате билда такого:

FROM alpine
ENTRYPOINT ["ls", "/usr"]
CMD ["/var"]

в результате будет выполнено обе команды (выполнится команда: «ls /usr /var«):

/usr:
bin
lib
local
sbin
share

/var:
cache
empty
lib
local
lock
log
mail
opt
run
spool
tmp

В конфиге должен присутствовать ENTRYPOINT или CMD или оба.

Инструкции ENTRYPOINT и CMD могут быть переопределены с помощью флагов командной строки

Флаг —entrypoint может быть использован, чтобы переопределить инструкцию ENTRYPOINT:

docker run --entrypoint <ENTRYPOINT> test

Все, что следует после названия образа в команде docker run, переопределяет инструкцию CMD:

docker run test <КОМАНДА> <АРГУМЕНТ_1> <АРГУМЕНТ_1>

 

Dockerfile имеет следующую логику заполнения:

  1. Первой инструкцией всегда идёт FROM с указанием родительского образа. Например, FROM python:latest.
  2. Инструкция RUN может принимать конвейер команд Linux, чтобы не создавать лишние слои. Например, RUN apt-get update && apt-get install python3-pip -y && pip install —upgrade pip && pip install pipenv.
  3. Инструкция WORKDIR устанавливает рабочий каталог контейнера. Например, WORKDIR /usr/src/app/. Последующие команды RUN, CMD, ENTRYPOINT наследуют привязку WORKDIR.
  4. Завершающей инструкцией всегда идёт CMD. Например, CMD [«python», «web_interface.py»]. CMD наследует привязку к WORKDIR, поэтому web_interface.py будет запущен из папки /usr/src/app/.

пример Dockerfile:

FROM python:latest
RUN apt-get update && apt-get install python3-pip -y && pip install --upgrade pip && pip install pipenv
RUN mkdir -p /usr/src/app/
WORKDIR /usr/src/app/
COPY . /usr/src/app/
EXPOSE 5000
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "web_interface.py"]