首页 > 解决方案 > 在构建阶段从基础镜像执行 ENTRYPOINT

问题描述

我正在使用一个代码生成器工具,它以 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 & 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输出中复制和粘贴吗?到目前为止,我自己的研究一无所获……

标签: dockerdockerfile

解决方案


引入了 Multi-Stage 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/ .

看来您的方法目前是正确的,并且是唯一的解决方法。


推荐阅读