Создание нового образа из нескольких исходных образов
На этом шаге мы научимся создавать новый Docker-образ, объединяя содержимое нескольких исходных образов. Это распространённый сценарий, когда вам нужно собрать образ, включающий компоненты из разных базовых образов или предварительно собранных образов.
Сначала загрузим необходимые исходные образы. В качестве примеров будем использовать образы ubuntu
и alpine
.
docker pull ubuntu:latest
docker pull alpine:latest
Вы должны увидеть вывод, указывающий на загрузку образов.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
Теперь создадим новый образ с помощью Dockerfile
. Dockerfile
— это текстовый документ, содержащий все команды, которые пользователь может выполнить в командной строке для сборки образа. Создайте новый файл с именем Dockerfile
в вашей директории ~/project
.
nano ~/project/Dockerfile
Добавьте следующее содержимое в Dockerfile
:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
Разберём этот Dockerfile
:
FROM ubuntu:latest AS base
: Эта строка устанавливает базовый образ для первого этапа сборки как ubuntu:latest
и называет этот этап base
.
FROM alpine:latest AS alpine_base
: Эта строка начинает новый этап сборки, используя alpine:latest
в качестве базового образа, и называет этот этап alpine_base
. Это многоэтапная сборка, позволяющая копировать файлы между этапами.
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
: Эта команда копирует файл /etc/alpine-release
из этапа alpine_base
в директорию /app/alpine-release
текущего этапа.
COPY --from=base /etc/os-release /app/ubuntu-release
: Эта команда копирует файл /etc/os-release
из этапа base
в директорию /app/ubuntu-release
текущего этапа.
WORKDIR /app
: Устанавливает рабочую директорию для последующих инструкций как /app
.
CMD ["ls", "-l"]
: Задаёт команду по умолчанию, которая выполняется при запуске контейнера из этого образа. Она выводит содержимое директории /app
.
Сохраните Dockerfile
, нажав Ctrl + X
, затем Y
и Enter
.
Теперь соберём образ с помощью команды docker build
. Символ .
в конце команды указывает контекст сборки — текущую директорию (~/project
).
docker build -t my-multi-stage-image:latest ~/project
Вы должны увидеть вывод, показывающий процесс сборки, включая выполнение различных этапов.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
После завершения сборки вы можете проверить создание образа, выведя список локальных образов.
docker images my-multi-stage-image
В списке должен появиться ваш новый образ.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
Наконец, запустим контейнер из этого образа, чтобы увидеть скопированные файлы.
docker run --rm my-multi-stage-image:latest
Флаг --rm
автоматически удаляет контейнер после его завершения. В выводе должны отобразиться файлы, скопированные из образов ubuntu
и alpine
.
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
Это подтверждает, что мы успешно создали образ, объединив содержимое нескольких исходных образов с помощью многоэтапной сборки.