Образ докера из каталога сборки и исходного каталога

#docker

Вопрос:

Большинство файлов DockerFiles, похоже, генерируют изображение из каталога исходного кода. Есть ли причина, по которой это делается?

Например, если я выполняю команды сборки на компьютере с Windows, копирую папку dist на компьютер с Linux и выполняю ее в соответствии с вариантом 2, разве это не должно работать?

Вариант 1 — Файл Docker (из исходного каталога)

 FROM node:latest as build    
WORKDIR /usr/local/app    
COPY ./ /usr/local/app/    
RUN npm install    
RUN npm run build    
FROM nginx:latest    
COPY --from=build /usr/local/app/dist /usr/share/nginx/html    
EXPOSE 80
 

Вариант 2 — Файл Dockerfile из выходных данных сборки

 FROM nginx:latest    
COPY dist /usr/share/nginx/html    
EXPOSE 80
 

Ответ №1:

В вашей первой форме используется многоступенчатая сборка Docker. Это имеет особое преимущество, заключающееся в том, что оно не зависит от каких-либо конкретных инструментов, установленных в хост-системе. Я бы рассмотрел этот путь:

  • Если у вас кластеризованная система CI, может быть гораздо проще запустить сборку в контейнере, чем пытаться вручную установить необходимые инструменты в каждой рабочей системе.
  • Если вы работаете на скомпилированном языке (C, Go, Rust, …), вы можете последовательно использовать контейнеры Linux, даже если разработчики используют другую ОС хоста.
  • Если вам нужно выполнить дополнительную работу по настройке системы сборки, например, установить дополнительные пакеты разработки на языке C.
  • Если вам нужна действительно точная версия языковой среды выполнения по какой-либо причине.

Второй путь зависит от наличия цепочки инструментов, доступной за пределами среды контейнера. Это не обязательно проблема; у большинства интерфейсных разработчиков, вероятно, в любом случае будет установлен узел. Я бы рассмотрел этот путь:

  • Если результат сборки чрезвычайно переносим в разных средах (скомпилированный HTML и Javascript; .jar файлы Java; интерпретированный код сценариев Python или Ruby в текстовом формате).
  • Если нет больших различий в разных версиях самой языковой среды выполнения для создания сборки. (Делает ли ваша сборка Webpack что-либо другое на узле 8, 10, 12 или 14?)
  • Если система сборки является чем-то простым в установке или предустановленным в большинстве сред хоста. (Например, в большинстве систем Linux и macOS есть Python.)
  • Если система сборки хоста может выполнять инкрементные сборки или иным образом работать намного быстрее, чем сборка контейнера с чистого листа.

Для того, что вы показываете, с помощью простого интерфейсного приложения, скомпилированного в статические файлы, ваша вторая форма просто прекрасна. Если вы посмотрите на вопросы SO Java, они почти всегда COPY представляют собой готовый .jar файл в образ, без включения цепочки сборки.

Комментарии:

1. Ответ имеет смысл. Спасибо!