Pull to refresh

Comments 12

Просьба, в начале или конце давать список с предыдущими частями, спасибо.
Как выглядит итоговый докер контейнер, его можно просто скопировать в другое место?
Что делать, если внутри контейнера нужно собрать программу из исходников?
Как выглядит итоговый докер контейнер, его можно просто скопировать в другое место?

Если не вдаваться в подробности — как набор файлов в изолированной файловой системе. Скопировать можно либо используя команды docker export/import, либо, что делается чаще докер просто push`ится в хранилище контейнеров (тот же Gitlab имеет такое), и после pull`ится из него на целевой хост.

Что делать, если внутри контейнера нужно собрать программу из исходников?

Установить внутрь docker контейнера компилятор и зависимости и собрать программу.
Обычно для сборки программы и для запуска используются разные контейнеры. То есть один контейнер собирает программу из исходников, собирает пакет (deb/rpm/etc) и отправляет этот пакет в репозиторий. Из этого репозитория пакет устанавливается в другой docker контейнер (где нет компилятора и всего остального, что нужно только для сборки) и уже этот контейнер идет в тестинг/стейдж/прод
RUN apk update && apk upgrade && apk add bash


Кстати нюанс писать несколько команд через && крайне полезен. Он означает что вместо трех отдельных слоев будет создан лишь один, что заметно уменьшает и размер образа и скорость его разворачивания.
В некоторых случаях (тестирование, сборка), время на разворачивание образа может быть сравнимо со временем его использования, и «смержив» лишние слои в один, вы можете добиться увеличения производительности в разы.
UFO just landed and posted this here
Слои в итоговом образе создают только инструкции FROM, RUN, COPY, и ADD


Хочу поправить: каждая инструкция создает слой, другой вопрос, что размер 0 байт. Но, технически это слой со своим идентификатором.

docker history IMAGE_NAME

IMAGE          CREATED          CREATED BY        SIZE        COMMENT
b260ce07d157   40 hours ago   /bin/sh -c #(nop)  ENTRYPOINT ["/bin/bash" "…   0B        
bc023bba0660   40 hours ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
00379739f45e   40 hours ago   /bin/sh -c #(nop) COPY file:d02b4d459390bf78…   134B      
Прежде чем комментировать, конечно, полезно внимательно почитать документацию.

Only the instructions RUN, COPY, ADD create layers. Other instructions create temporary intermediate images, and do not increase the size of the build.


:)
Но, ведь инструкция CMD и ENTRYPOINT используется для запуска команды в слое Thin R/W Layer при запуске контейнера, а не в промежуточных RO слоях.
Sign up to leave a comment.