我有一个基于onbuild标记的docker图像,我想用它作为构建的模板,但我希望子图像能够设置ENV var来修改ONBUILD指令
基onbuild:
FROM root-image
RUN mkdir -p /app/src
UNBUILD COPY . /app/src/
ONBUILD WORKDIR /app/src
ONBUILD RUN ./build ${TARGET_APP}
ONBUILD RUN cp ${TARGET_APP}/build/bin /app/bin
我的应用程序内:
FROM base-onbuild
ENV TARGET_APP my-app
CMD my-app
根据docker文档,ONBUILD步骤在FROM base-onbuild子句之后立即运行,因此在设置TARGET_APP的ENV语句之前,在ONBUILD步骤中没有设置TARGET_APP.
我也尝试通过docker build的–build-args参数传递TARGET_APP值,但这也没有任何效果.
类似的问题:Placeholder field for the ONBUILD section for child docker images to use
最佳答案
强制性的arg
我在你的问题中有一些适用于这种情况的东西,但它不适用于所有情况.
在ONBUILD WORKDIR / app / src之后的dockerfile中,你将拥有:
COPY build_copy.sh /config
ONBUILD COPY target_app.txt /config
ONBUILD RUN sh /config/build_copy.sh
文件build_copy.sh将包含以下行:
TARGET_APP=`cat /config/target_app.txt`
ONBUILD RUN ./build $TARGET_APP
ONBUILD RUN cp $TARGET_APP/build/bin /app/bin
文件target_app.txt应包含您要放入TARGET_APP的文本.
这将要求您在子图像中有一个文件target_app.txt.
可选的arg
您可以通过在子根目录中的文件夹/ config中放置“可选”文本文件并将ONBUILD更改为:
ONBUILD COPY /config /config
您只需要该文件夹,其中的所有文件都是可选的.然后shell脚本可以使用:
TARGET_APP_2=`cat /config/target_app.txt`
if [ -n "$TARGET_APP_2" ]
then
TARGET_APP=$TARGET_APP_2
else
TARGET_APP='default_app'
fi