Docker Builder

Практика

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

 

Будем собирать контейнер с bash и cat внутри

Добавим пользователя в группу docker, что бы не вводить постоянно sudo и не работать под рутом

usermod -aG docker JackieChan

создадим временный коталог

sudo mkdir -p /laba/bashcat

назначим нашего пользователя владельцем директории

sudo chown JackieChan /laba/bascat

перейдем в него и создадим директорию rootfs которая будет импровизированным корнем файловой системы докер контейнера

cd /laba/bashcat

mkdir rootfs

сначала заберем команду bach , с помощью команды whereis bash найдем ее местонахождение

whereis bash

bash: /usr/bin/bash       /usr/share/man/man1/bash.1.gz

команда внутри контейнера должна находится по такому же пути, соответсnвенно создадим директории /usr/bin/

mkdir -p /laba/bashcat/rootfs/usr/bin/

скопируем команду bash в эту директорию

cp /usr/bin/bash /laba/bashcat/rootfs/usr/bin/

и файлы библиотек, с помощью команды ldd проверим какие библиотеки использует команда bash

ldd /usr/bin/bash

linux-vdso.so.1 (0x00007ffeeaaa1000)    <----    Эта библиотека встроенная
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x0000775e15235000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000775e15000000)
/lib64/ld-linux-x86-64.so.2 (0x0000775e153de000)

создадим необходимые каталоги в rootfs

mkdir -p lib/x86_64-linux-gnu
mkdir -p lib64

и скопируем туда эти библиотеки

cp /lib/x86_64-linux-gnu/libtinfo.so.6 /laba/bashcat/rootfs/lib/x86_64-linux-gnu/

cp /lib/x86_64-linux-gnu/libc.so.6 /laba/bashcat/rootfs/lib/x86_64-linux-gnu/

cp /lib64/ld-linux-x86-64.so.2 /laba/bashcat/rootfs/lib64/

теперь тоже самое для команды cat, проверим где лежит cat и создадим каталог

whereis cat
cat: /usr/bin/cat       /usr/share/man/man1/cat.1.gz
cp /usr/bin/cat /laba/bashcat/rootfs/usr/bin/

cat использует те же библиотеки и повторно их копировать ненужно

проверим содержимое через команду tree

tree
.
└── rootfs
├── lib
│   └── x86_64-linux-gnu
│   ├── libc.so.6
│   └── libtinfo.so.6
├── lib64
│   └── ld-linux-x86-64.so.2
└── usr
└── bin
├── bash
│   └── bash
└── cat


Сначала с помощью команды tar создадим архив , отправляем в стандартный вывод и при помощи  |  пайпа перенаправим в команду docker import

tar -C rootfs -c . | docker import - bashcat

-C меняет рабочий каталог на rootfs

-c означает create

. весь текущий каталог

docker import - минус значит забирать из стандартного ввода

bashcat собрать образ с таким именем


 

Соберем контейнер с ubuntu внутри и процессом с пинг внутри 

создадим директорию mybuild уже в существующей папке /laba

sudo mkdir /laba/mybuild

теперь создадим скрипт, который будет являться процессом запускаемым при старте контейнера

vim docker-enrypoint.sh

#!/bin/bash
#ping 8.8.8.8

добавим права на исполнение

chmod a+x docker-enrypoint.sh

создадим docker файл с большой буквы

Обязательно должен быть любой базовый образ FROM ubuntu

vim Dockerfile

FROM ubuntu

RUN apt update && apt install -y iputils-ping

COPY docker-entrypoint.sh /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

Построим образ из docker файла 

Находясь в той же директории где и скрипт и наш докерфайл, запустим сборку

docker build .

проверим, появился ли образ

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7c58d722ad3c 21 seconds ago 114MB

 

и развернем из этого образа контейнер с флагом --rm чтобы он удалился, после того как мы его остановим

docker run --rm -it 7c58d722ad3c

docker run -it 7c58d722ad3c /bin/bash
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=16.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=17.0 ms

Каждая инструкция в докерфайл это отдельный слой