Перейти к содержанию

Создание минималистичного образа docker

Образ docker может быть создан без базового образа. Для этого нужно только само приложение, которое может быть выполнено в вашей системе.

Для создания образа "с нуля" нужно обеспечить наличие бинарного файла (файлов) приложения, которое нужно поместить в образ. При этом, бинарные файлы либо должны быть собраны путем статической линковки со всеми необходимыми зависимостями, либо все файлы таких зависимостей должны быть также включены в контейнер.

Ниже рассмотрим создание классического приложения на языке Си, отображающее на экране "Hello, World!".

Просмотр зависимостей

Можно посмотреть список файлов, от которых зависит данный бинарный файл командой:

ldd filename

Исходный код:

hello.c
#include <stdio.h>
int main(void) {
    printf("Hello, World!\n");
    return 0;
}

Скомпилируйте приложение (обратите внимание на опцию статической линковки):

gcc hello.c -o hello -static

Создайте Dockerfile следующего содержания:

FROM scratch
ADD hello /
CMD ["/hello"]

Это простейший сценарий создания образа контейнера, который не требует никаких базовых образов, добавляет в корень файловой системы контейнера файл hello и затем исполняет его. Здесь становится понятно, зачем была нужна статическая линковска - без нее в файловой системе контейнера не существовало бы необходимых файлов зависимостей.

Создайте образ:

docker build -t hello:1 --rm .

Запустите контейнер из созданного образа:

docker run hello:1

Очистить систему можно одной строкой:

docker stop $(docker ps -qa) && docker rm $(docker ps -qa) && docker rmi -f $(docker images -qa) && docker volume rm $(docker volume ls -q) && docker network rm $(docker network ls -q)