如何创建使用env vars的灵活的onbuild docker镜像?

时间:2015-11-25 21:08:37

标签: docker docker-onbuild

我有一个基础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

1 个答案:

答案 0 :(得分:3)

强制性arg

我的问题中有一些适用于此案例的内容,但它不适用于所有情况。

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。

可选的arg

您可以通过在子根目录中的文件夹/ 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);
}