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 имеет следующую логику заполнения:
- Первой инструкцией всегда идёт 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/.
пример 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"]