Сборка образа из 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.
