OpenShift BuildConfig挂载ConfigMap为属性文件构建失败问题咨询
问题根因
你在BuildConfig的source.configMaps配置中未指定挂载的目标路径,OpenShift默认不会将ConfigMap内的文件同步到构建上下文的根目录,导致Dockerfile执行时找不到MyApp.properties文件。同时你当前Dockerfile中source命令的写法存在作用域问题,即使文件能找到,后续RUN指令也无法读取到加载的变量。
解决方案
方案1:修正ConfigMap挂载配置+调整Dockerfile
第一步:修改BuildConfig的source段,指定ConfigMap挂载到构建上下文根目录
source: contextDir: "${param_source_contextdir}" configMaps: - configMap: name: "${param_app_name}-configmap" destinationDir: "." # 指定将ConfigMap内的文件放到构建工作目录根路径
第二步:修正Dockerfile的变量加载逻辑
每个RUN指令都会启动独立的shell进程,单独执行source命令的变量仅在当前RUN层生效,后续指令无法读取,需要调整为两种写法二选一:
- 写法1:将变量加载和使用变量的命令合并到同一个RUN层
# 将source和curl等依赖变量的命令放在同一RUN段 RUN ["sh", "-c", "source ./MyApp.properties && curl -s --create-dirs --insecure -L ${ARTIFACTURL} -o ${APPPATH}/${ARTIFACT}"] # EXPOSE指令不支持动态变量读取,如果要使用MY_PORT变量,需要把变量写入全局环境配置 RUN ["sh", "-c", "source ./MyApp.properties && echo \"export APPPATH=${APPPATH}\" >> /etc/profile && echo \"export MY_PORT=${MY_PORT}\" >> /etc/profile"] EXPOSE $MY_PORT
- 写法2:直接把属性文件内容导入全局环境,所有后续RUN层和运行时都可读取
COPY MyApp.properties /tmp/MyApp.properties RUN cat /tmp/MyApp.properties >> /etc/profile && rm -f /tmp/MyApp.properties # 后续所有指令都可以直接使用变量 RUN curl -s --create-dirs --insecure -L ${ARTIFACTURL} -o ${APPPATH}/${ARTIFACT}
方案2:更简化的原生实现(推荐,完全满足你无需修改BuildConfig新增变量的需求)
不需要把属性文件作为整体存入ConfigMap,直接使用BuildConfig的envFrom字段批量注入ConfigMap的所有键值对为构建环境变量,完全不用修改Dockerfile,也不用逐个声明环境变量:
第一步:创建ConfigMap保持版本一的写法即可
oc create configmap myapp-configmap --from-env-file=MyApp.properties
第二步:修改BuildConfig的strategy段,批量注入所有环境变量
strategy: dockerStrategy: env: - name: GIT_SSL_NO_VERIFY value: "true" # 批量注入ConfigMap内所有键值对为构建环境变量,后续新增变量直接修改ConfigMap即可,无需改动BuildConfig envFrom: - configMapRef: name: "${param_app_name}-configmap"
这个方案不需要改动你版本一的Dockerfile,新增变量只要在属性文件里加键值对、重建ConfigMap后重新构建即可生效,比挂载文件的方案更稳定,也不会有变量作用域的问题。
内容的提问来源于stack exchange,提问作者maverick
相关产品推荐
相关产品推荐

