суббота, 28 февраля 2015 г.

Dockerfile

Build cache - когда мы отбилдили какойнибудь Dockerfile последующие билды будут в разы быстрее, потому что будет билдится только новое, все остальные слои просто используются.
Но можно: docker build --no-cache=true {...}

FROM - базовый образ/имидж из которой создается текущий контейнер.
RUN - команды, которые будут запускаться при сборке этого образа. Каждая такая команда запускается в writable layer предыдущего образа, и потом комитится, создавая образ для следующей RUN строки, таким образом, если у нас изменения происходят на какой-то из строк RUN, то может использоваться кеш из образа который выше изменения, и только последующий перевыполняются и перезаписуют свои образы. Чем меньше RUN тем меньше дискогового пространства будет задействовано, но во время активного написания билда, полезно использовать много RUN, чтобы эффективные/быстрее пробовать/проверять стремные изменения, потом можно обьединить в один RUN, когда все оттестировано.
CMD - команды, которые будут запускаться каждый раз при запуске контейнера. По факту в виде shell form это запускается как /bin/bash -c "то что мы определили". И мы тут можем начинять и пайпами и переадресацией потоков и т.д.
Exec form - ["commOrArg1", "commOrArg2"] этот вариант не требует чтобы в контейнере была установлена оболочка, также каждая команда экранируется.
Команды cmd могут быть подменены на этапе запуска контейнера путем:
docker run ... {команда}
ENTRYPOINT - не может быть перегружена docker run ... в отличии от CMD. Зато все, что мы передаем таким способом на этапе запуска, интрепритируется как аргументы в ENTRYPOINT. Таким образом мы уже не можем попасть в запущеный контейнер через такой аргумент. Например:
ENTRYPOINT ["echo"]
И мы пытаемся:
# docker run -it mycontainer /bin/bash
Но мы не подключимся к нему, а получим:
# docker run -it mycontainer /bin/bash
/bin/bash
#

Чтобы все-таки ENTRYPOINT перегрузить полностью можно воспользоваться ключем --entrypoint.

В докер-файлах пользуются ENTRYPOINT чтобы определить процесс, который будет работать в контейнере, а CMD - чтобы определить дефолтовые параметры для него, которые также можно переопределить при запуске контейнера если что:

ENV var1=val1 var2=val2 - определение переменный окружения
VOLUME ["/data"] - создаеть отвязанное от контейнера хранилище, которое будет храниться в стандартном месте хостовой машины(var/lib/docker/vfs/dir/CONTAINERHASH), при удалении контейнера место останется с данными, также можно разделять с другими контейнерами общее хранилище или загружать оттуда некие индивидуальные настройки под контейнер.

EXPOSE 80 - указываем какой порт мы открываем из контейнера. А при запуске с помощью параметра -p мы уже определяем порт хоста, который подвязывается на порт контейнера и у нас получается пайп снаружи в контейнер.

ADD vs COPY
COPY - копирует файлы с указанного места ОС-хозяина в контейнер.
ADD - тут можно указывать первым аргументом и место/ресурс в файловой системе и URL удаленного сетевого ресурса, если ресурсы заархивирован, то он еще и розархивируется в контейнере.
Всегда лучше использовать COPY, если мы имеем дело с местом в ОС, и только если нам нужен архив или ресурс из сети, то тогда ADD.

Комментариев нет:

Отправить комментарий