在构建阶段从基本映像执行ENTRYPOINT

时间:2019-03-15 09:06:04

标签: docker dockerfile

我正在使用代码生成器工具,该工具作为带有ENTRYPOINT的Docker映像提供。即对于手动用例,我执行以下命令行:

$ 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 principle,即,每次上游项目对其Dockerfile进行不兼容的更改时,我都需要更新ENTRYPOINT

我可以避免从docker inspect输出中进行复制和粘贴吗?到目前为止,我自己的研究没有发现任何东西...

1 个答案:

答案 0 :(得分:0)

引入了多阶段Dockerfile来优化容器docs的整体大小。

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/ .

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