Можно ли создать многоступенчатый файл Dockerfile, в котором образы из FROM могут относиться к разным linux дистрибутивам ОС? - PullRequest
0 голосов
/ 16 июня 2020

Можно ли использовать многоступенчатый Dockerfile, в котором первый базовый образ относится к Ubuntu, а второй - к Alpine. Я знаю, что конечный образ, полученный в результате сборки с использованием этого файла Docker, не может быть выполнен на платформе Ubuntu, поскольку он также содержит инструкции Alpine и те же самые, если вы выполняете его на Alpine. Но я все же хотел бы подтвердить, так ли это.

Например, вот мой пример Dockerfile:

FROM some-ubuntu-base-image:latest 

RUN apt-get update && apt-get install -y my-ubuntu-package

FROM some-alpine-base-image:latest

RUN apk add my-alpine-package

............
.............

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

Во-первых, ничто не мешает запуску образа Alpine на хосте Ubuntu docker. Это разные файловые системы, работающие поверх одного и того же ядра Linux, и общее ядро ​​не влияет на возможность запуска различных двоичных файлов / библиотек дистрибутива.

Из многоступенчатой ​​части вы можете использовать все, что угодно. изображение, которое вы хотите для каждого состояния, каждое из них не зависит друг от друга. Многоступенчатость - это не способ объединения изображений, в начале второго этапа (если этот этап не является выходом первого этапа) у вас нет ничего из первого этапа в файловой системе этого второго этапа.

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

1 голос
/ 16 июня 2020

Да, это оно. Однако это может вызвать проблемы: если вы используете динамическое связывание c, вы можете копировать исполняемый файл, для которого требуется версия библиотеки, которая была доступна на этапе, на котором вы его сделали, но не в дистрибутиве вашего окончательного образа. Однако это не большая проблема для языков / программ, скомпилированных статически (например, Go), поскольку они по сути объединяют библиотеки, которые они используют, в исполняемый файл.

Однако, если вы можете, вам следует избегать этого. За исключением конкретных случаев c, это риск несовместимости, который не представляет особой ценности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...