Создание собственного base-образа Docker

Thank you for reading this post, don't forget to subscribe!

Для Docker мы можем най­ти боль­шое коли­че­ство гото­вых базо­вых обра­зов на осно­ве раз­лич­ных опе­ра­ци­он­ных систем. Но если нуж­но­го нам нет, то преду­смот­рен меха­низм созда­ния сво­е­го соб­ствен­но­го ими­джа. Рас­смот­рим про­цесс подроб­нее на базе Astra Linux (Deb).

Предварительная подготовка

Преж­де чем начать, выпол­ним сле­ду­ю­щие действия:

1. Раз­вер­нем систе­му, из кото­рой мы будем делать образ. У меня был Astra Linux SE 1.7. Тех­ни­че­ски, это делать не обя­за­тель­но — уста­но­вив CentOS, мы можем сде­лать образ для Ubuntu. Но так прой­дет не во всех случаях.

2. Уста­но­вим на систе­му, в кото­рой мы будем рабо­тать, Docker.

Мы гото­вы пере­хо­дить, непо­сред­ствен­но, к рабо­там по созда­нию базо­во­го образа.

Создание образа с помощью bootstrap

Луч­ше все­го исполь­зо­вать Debootstrap/Yumbootstrap. Дан­ный инстру­мент поз­во­ля­ет уста­но­вить базо­вую опе­ра­ци­он­ную систе­му в обыч­ный ката­лог. Нам необ­хо­ди­ма дан­ная про­це­ду­ра перед импор­том чистой систе­мы в Docker — это поз­во­лит убрать все лиш­нее и суще­ствен­но сни­зить объ­ем буду­ще­го образа.

В нашем при­ме­ре исполь­зу­ет­ся дис­три­бу­тив Astra Linux, кото­рый раз­ра­бо­тан на базе Debian. Для дан­ных систем уста­нов­ка выпол­ня­ет­ся командой:

apt install debootstrap

Выпол­ня­ем уста­нов­ку чистой систе­мы в каталог:

debootstrap 1.7_x86-64 astra-folder https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-main/

* тут есть несколь­ко важ­ных моментов:

  • 1.7_x86-64 — имя скрип­та из ката­ло­га /usr/share/debootstrap/scripts для уста­нов­ки систе­мы. Преж­де чем запус­кать коман­ду, сто­ит прой­ти по дан­но­му ката­ло­гу и най­ти имя нуж­но вам скрип­та. Это одна из при­чин, поче­му сто­ит созда­вать docker-образ в той же систе­ме — нуж­но­го нам скрип­та может не ока­зать­ся (мало­ве­ро­ят­но, что скрипт для Astra Linux будет в Rocky Linux).
  • astra-folder — имя локаль­но­го ката­ло­га, куда будет уста­нов­ле­на система.
  • https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-main — путь к репо­зи­то­рию, отку­да нуж­но взять базо­вые паке­ты. Дан­ная опция необя­за­тель­на, одна­ко в слу­чае с Astra Linux, debootstrap пыта­ет­ся най­ти паке­ты в репо­зи­то­ри­ях debian, что при­во­дит к ошибке.

В моем слу­чае вышевве­ден­ная коман­да завер­ша­лась ошиб­кой из-за отсут­ствия неко­то­рых фай­лов so. Что­бы решить про­бле­му, во вре­мя ее выпол­не­ния нуж­но открыть вто­рой сеанс кон­со­ли и ско­пи­ро­вать фай­лы из систе­мы в ката­лог уста­нов­ки, например:

cp /usr/lib/{libparsec-base.so.3,libparsec-aux.so.3} astra-folder/usr/lib/

* в нашем слу­чае это 2 фай­ла — libparsec-base.so.3 и libparsec-aux.so.3.

Ути­ли­та debootstrap загру­зит мини­маль­ный набор паке­тов с репо­зи­то­рия и выпол­нит уста­нов­ку систе­мы в ука­зан­ном нами каталоге.

Если нуж­но дора­бо­тать нашу систе­му — уста­но­вить допол­ни­тель­ные паке­ты или загру­зить фай­лы, выпол­ня­ем все дей­ствия отно­си­тель­но создан­но­го ката­ло­га. В нашем примере:

chroot astra-folder

Теперь созда­ем образ для Docker:

tar -C astra-folder -c . | docker import - astra-se1.7:1

* где astra-folder — создан­ный ката­лог с уста­нов­лен­ной систе­мой; astra-se1.7:1 — назва­ние и вер­сия образа.

Гото­во. Посмот­реть спи­сок обра­зов мож­но командой:

docker images

Создание образа с помощью tar

В инструк­ции был рас­смот­рен спо­соб с пра­виль­ной под­го­тов­кой обра­за и исполь­зо­ва­ни­ем его. Если есть при­чи­на не исполь­зо­вать инстру­мент Debootstrap/Yumbootstrap, то мож­но создать более гру­бый образ с исполь­зо­ва­ни­ем tar. Такой образ будет иметь, куда, боль­ший раз­мер, но в неко­то­рых слу­ча­ях это может быть не принципиально.

Рабо­та долж­на выпол­нять­ся в систе­ме, из кото­рой мы сде­ла­ем образ. При жела­нии, мы можем зара­нее уста­но­вить необ­хо­ди­мые инстру­мен­ты или наобо­рот, что­бы образ зани­мал мень­ше места, уда­лить неко­то­рые паке­ты и файлы.

После вво­дим команду:

tar --numeric-owner --exclude=/proc --exclude=/sys -cf astra-base.tar /

* где astra-base.tar будет име­нем tar-фай­ла с нашей систе­мой. В него попа­дет содер­жи­мое всех ката­ло­гов, кро­ме /proc и /sys.

И созда­ем образ:

cat astra-base.tar | docker import - astra-se1.7:1

* где astra-base.tar — создан­ный тар­бол; astra-se1.7:1 — имя обра­за, кото­рый будет создан.

Про­ве­ря­ем:

docker images

Мы долж­ны уви­деть что-то на подобие: