Dockerfile

Введение

Dockerfile используется для создания образов. Команда build создаёт образ в соответсвии с инструкциями внутри докерфайла.

Если вы использовали make или batch файлы, то сможете увидеть некоторые аналогии.

Принцип написания инструкций в докерфайлах следующий:

То, что будет меняться реже всего нужно писать вверху.

Это позвояет экономить время - меньше слоёв нужно пересобирать.

Своё название

По умолчанию Docker ждёт, что докерфайл называется Dockerfile

Если вам нужно использовать несколько разных докерфайлов - можно дать каждому своё название.

Называть докерфайлы нужно в соответсвии с документацией :

Dockerfile.name

Например, можно называть по имени дистрибутива или по назначению:

Dockerfile.ubuntu , Dockerfile.debug и так далее

FROM

Инструкция FROM нужна, чтобы использовать другие образы. Если вам будет нужен Python можно взять готовый образ

FROM python:3.9

LABEL

Инструкция LABEL нужна, чтобы указать автора

LABEL author="andreyolegovich"

RUN

Инструкция RUN нужна, чтобы запусть команды. Например, команды Bash

RUN python -m pip install --upgrade pip # или RUN npm install

COPY

Когда код уже готов к продакшену инструкцией COPY его копируют в контейнер.

COPY src/ $YOUR_APP

ENTRYPOINT

Инструкция ENTRYPOINT указывает на точку входа в контейнер.

Желательно оформить в виде json массива.

ENTRYPOINT ["node", "server.js"]

Часто применяется в случае, когда нужно выполнить несколько команд сразу после запуска контейнера.

Рассмотрим пример - нужно выполнить следующий скрипт

#!/bin/bash mkdocs build tail -f /dev/null

Предварительно скрипт нужно поместить в ту директорию контейнера, в которой находится mkdocs.yml

Структура проекта

dockerfiles/ |-- Dockerfile.mkdocs `-- mkdocs `-- entrypoint.sh

… WORKDIR /mkdocs/documentation COPY mkdocs/entrypoint.sh /mkdocs/documentation RUN chmod +x entrypoint.sh ENTRYPOINT ["/mkdocs/documentation/entrypoint.sh"]

WORKDIR

Инструкция WORKDIR указывает на рабочую директорию. Где данный контейнер будет запускаться.

пример

WORKDIR /var/app

EXPOSE

Инструкция EXPOSE открывает определённый порт

Например открыть порт 5000 для Flask

EXPOSE 5000

ENV

С помощью ENV можно задать переменные окружения.

Например можно задать рабочую директорию через ENV и потом переиспользовать

ENV APP_DIR=/home/app/python RUN mkdir -p $APP_DIR WORKDIR $APP_DIR COPY src/ $APP_DIR

VOLUME

С помощью VOLUME можно указать в какой диретории создать внешний раздел.

VOLUME ["/var/app"]

или несколько разделов

VOLUME ["/var/app", "/var/log]

CMD

С помощью CMD можно выполнить какую-то интересную команду с аргументами когда контейнер запустится.

Пример запуска SSH сервера

CMD ["/usr/sbin/sshd", "-D"]

Примеры

FROM python:3.9 ENV MICRO_SERVICE=/home/app/webapp # set work directory RUN mkdir -p $MICRO_SERVICE # where your code lives WORKDIR $MICRO_SERVICE # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # install dependencies RUN python -m pip install --upgrade pip # copy project COPY src/ $MICRO_SERVICE RUN python -m pip install -r ./requirements.txt EXPOSE 8501 CMD streamlit run app.py

Пример докерфайла для простейшего контейнера

# getting base image ubuntu # for emply image use: # FROM scratch FROM ubuntu MAINTAINER eth1.ru RUN apt-get update CMD ["echo", "HH: image is creating"]

Автор статьи: Андрей Олегович