我有一个基础onbuild
标记的泊坞窗图像,我想将其用作构建模板,但我希望子图像能够设置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
子句之后立即运行,因此在设置ENV
的{{1}}语句之前因此TARGET_APP
步骤ONBUILD
未设置。
我还尝试通过TARGET_APP
的{{1}}参数传递TARGET_APP
值,但这也没有任何效果。
我是否有其他方法可以设置变量并修改--build-args
步骤?
类似的问题:Placeholder field for the ONBUILD section for child docker images to use
答案 0 :(得分:3)
我的问题中有一些适用于此案例的内容,但它不适用于所有情况。
在COPY build_copy.sh /config
ONBUILD COPY target_app.txt /config
ONBUILD RUN sh /config/build_copy.sh
之后的dockerfile中,您将拥有:
TARGET_APP=`cat /config/target_app.txt`
ONBUILD RUN ./build $TARGET_APP
ONBUILD RUN cp $TARGET_APP/build/bin /app/bin
文件build_copy.sh将包含以下行:
ONBUILD COPY /config /config
文件target_app.txt应包含您要放入TARGET_APP的文本。 这将要求您在子图像中有一个文件target_app.txt。
您可以通过在子根目录中的文件夹/ config中添加“可选”文本文件并将ONBUILD更改为:
来缓解这种情况。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
您只需要该文件夹,其中的所有文件都是可选的。然后shell脚本可以使用:
#include <stdio.h>
void main()
{
double f = 0.12;
int d;
f *= 10; // f = 1.2
d = (int)f; // d = 1
f -= d; // f = 0.2
f *= 10; // f = 2.0
d = (int)f; // d should be 2
f -= d; // f should be 0.0
printf("%lf\n", f);
}