Выполнить ТОЧКУ ВХОДА из базового образа на этапе сборки

#docker #dockerfile

#docker #dockerfile

Вопрос:

Я использую инструмент генерации кода, который предоставляется в виде образа Docker с ENTRYPOINT . Т.е. для варианта ручного использования я выполняю следующую командную строку:

 $ docker run --rm -v ${PWD}:/local some/codegen-image:latest 
    generate  ... parameters for code generator tool ...
  

Пока все хорошо.

Но я хочу интегрировать образ генератора кода в мою собственную многоступенчатую сборку образа. Т.е. на первом этапе следует вызвать ENTRYPOINT базового образа для генерации кода, который будет использоваться на втором этапе:

 # stage 1
FROM some/codegen-image:latest as codegen

... build set up steps for stage 1 ...

# now run ENTRYPOINT from base image, copy amp; pasted from the output of
#
#  docker inspect -f '{{json .Config.Entrypoint}}' some/codegen-image:latest
#
RUN ["some_command", "option1", ..., "optionN",    
        "generate",                                
        ... parameters for code generator tool ... 
    ]

# stage 2
FROM some/other-image as stage2

... build set up steps for stage 2 ...

# copy-in generated code from stage 1
COPY --from=codegen /tmp/build/ .
  

Это работает, но нарушает принцип DRY, т. е. мне нужно обновлять свой Dockerfile каждый раз, когда вышестоящий проект вносит несовместимые изменения в свой ENTRYPOINT .

Могу ли я избежать копирования и вставки из docker inspect вывода? Мои собственные исследования пока ничего не дали…

Ответ №1:

Для оптимизации общего размера документов контейнера был введен многоступенчатый Dockerfile.

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

Ожидаемая функция еще не поддерживается docker.
Например.

 FROM some/codegen-image:latest as codegen
ARGS_ENTRYPOINT_OF_CODEGEN ["generate","parameters"]
.
.
.
FROM some/other-image as stage2
COPY --from=codegen /tmp/build/ .
  

Кажется, ваш подход на данный момент правильный и единственный обходной.