5. Сборка образа из dockerfile

Сборка образа из dockerfile

Для сборки собственных образов используются рецепты-инструкции, описываемые в dockerfile

сборка образа из dockerfile
docker build ./

Будет создан образбез имени и тега, только с ID
изменить это можно после создания добавив
docker tag ID ImageName:Version

сборка образа из dockerfile с именем и версией
docker build -t ImageName:Version ./

Основные команды dockerfile

Переменная в dockerfile
ARG value
Может быть объявлена как глобальная
используется при нескольких docker образах для сборки с определенным именем или когда 1 образ выполняет компиляцию, а 2й образ рабочий

в инструкциях использовать как ${value}

базовый образ:
FROM ubuntu:22.04

Дополнительное описание
LABEL tag=demonstaration

Запуск команд (и установка приложений) на примере ubuntu
RUN apt-get update
RUN apt-get install … -y

RUN chmod +x ./script.sh

примечание – лучше писать apt-get вместо apt иначе м.б. ошибка
-y лучше добавлять т.к. некоторые приложения дополнительно спрашивают “уверены ли вы”

Рабочие директории
WORKDIR /opt/…/
данная директория будет считаться директорией по умолчанию
т.е. при копировании через ./ будем обращаться к ней
также при заходе в образ в интерактивном режиме будем попадать в нее

Копирование файлов
COPY ./files/file.txt ./
COPY ./files/file.txt /opt/…/
копирование нескольких файлов
COPY ./files/file1.txt ./files/file2.txt /opt/…/

примечание: при указанании
WORKDIR /opt/…/
COPY files/file.txt ./ равносильно COPY files/file.txt /opt/…/

Переменные среды (по умолчанию)
ENV TYPE=demo
ENV OWNER=admin
они видны внутри контейнера по команде в bash ‘env’ и могут быть перезаписаны при старте контейнера с параметром -e

в dockerfile доступ к переменным среды стандартный через $ – например $ OWNER
примечание: параметр передаваемый через -e будет виден уже после запуска контейнера
т.е. если запустить контейнер с -e OWNER=admin2
до запуска контейнера существует ENV OWNER=admin, а после будет перезапись на admin2
по сути там ститическая компиляция (в образу везде будут сттические значения по умолчанию), для того, чтобы динамически подменять значения – используются bash скрипты
в требуемых местах оформляются переменные нестандартным типом
например: в каком-то файле (file.txt) надо использовать переменную среды $OWNER
записываем ее как %OWNER%

создаем script.sh с содержимым
#!/bin/bash
sed -i ‘s|%OWNER%|’“$OWNER”‘|g’ ./file.txt
или например:
sed -i ‘s|%DEFAULTS_PATH%|'”$DEFAULTS_PATH”‘|g’ ./file.txt
важно – правильно указывать кавычки – в текстовом редакторе и командной строке это разные символы

в dockerfile прописываем копирование скрипта (COPY) и chmod +x и в конце

CMD [“./script.sh”]

Порты:
EXPOSE 80
EXPOSE 80/tcp

через команду
docker image inspect ImageName можно получить подчказку какие порты нужны
если запустить контейнер без проброса портов в docker ps они тоже будут указаны

Точка входа и команды при запуске контейнера
ENTRYPOINT [“echo”, “msg”]

CMD [“echo”, “msg”]
CMD [“nginx”, “-g”, “daemon off;”]

команды можно писать и как в linux
ENTRYPOINT echo “msg”, но правильнее как представлено выше в execute формате

В чем разница
CMD – запускется в командной строке и может быть переаписана через -it (интерактивный режим), в интерактивном режиме мы создаем точку входа в программу (ЕЕ ИЗМЕНИТЬ МОЖНО)
ENTRYPOINT – точка входа в программу и она не может быть перезаписана через интерактивный режим (ЕЕ ИЗМЕНИТЬ НЕЛЬЗЯ)

их можно использовать одновременно
ENTRYPOINT [“echo”]
CMD [“msg”]

в этом случае все приходящие команды выполнчются как дополнение к ENTRYPOINT и даже если запустить контейнер с дополнением – оно передастся в ENTRYPOINT-echo

docker run ImageName Hello Docker
в результате msg будет перезаписано, а в консоль выведется Hello Docker.

Leave a Reply

Your email address will not be published. Required fields are marked *