Dockerfile
Введение | |
Своё название | |
FROM | |
LABEL | |
RUN | |
COPY | |
ENTRYPOINT | |
WORKDIR | |
EXPOSE | |
ENV | |
VOLUME | |
CMD | |
Примеры | |
Статьи про Docker |
Введение
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"]