【问题标题】:Dockerfile: Bash export statement not workingDockerfile:Bash 导出语句不起作用
【发布时间】:2021-08-19 20:11:03
【问题描述】:

我使用 dockerfiles 来创建一个容器。我知道 docker,但我对 bash 的理解非常有限。我知道这个问题可能是重复的,但我不明白要搜索什么。

问题 步骤RUN export A_NUM=$(echo ${A_VERSION} | head -c 3) 不起作用。即使在bash 中它也能完美运行。我试过了:

  1. 设置ENV A_VERSION=$A_VERSION
  2. 在 bash 中复制我的问题(通过进入构建的容器)

dockerfile 中的任何 export 声明似乎都是徒劳的 - 谁能解释一下?

设置

我有 app_A 和 app_B。当我配置 app_B 时,我需要考虑所选版本的 app_A。一个简化的 dockerfile 如下所示:

FROM openjdk:8-jdk-slim

ARG A_VERSION=3.1.3
# RUN install app_A with A_VERSION 
# RUN install app_B
 
WORKDIR /HOME/A_USER
USER A_USER

# RUN set some environment variables for app_A


RUN export A_NUM=$(echo ${A_VERSION} | head -c 3) 
RUN echo $A_NUM

RUN if awk 'BEGIN {exit !('$A_NUM' >= '3.2')}'; then export path_A="/opt/Name_A"; else export path_A="/usr/local/Name_A"; fi 

# RUN Use B_VERSION to set some environment variables for app_B

【问题讨论】:

  • 我现在编写了一个单独的 bash 脚本来创建容器。 if awk-line 从 dockerfile 中的 ARG 命令执行并将其参数传递给ARG

标签: bash docker dockerfile


【解决方案1】:

每个RUN 都是一个单独的 bash 进程,具有自己的环境变量。您必须在单个 RUN 中运行所有 bash 命令:

RUN export A_NUM=$(echo ${A_VERSION} | head -c 3) \
    && echo $A_NUM \
    && if awk 'BEGIN {exit !('$A_NUM' >= '3.2')}'; then export path_A="/opt/Name_A"; else export path_A="/usr/local/Name_A"; fi 

此外,您将节省磁盘空间,因为每个RUN 都会创建一个图像。

【讨论】:

猜你喜欢
  • 2021-11-03
  • 2015-08-17
  • 2016-12-11
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2012-02-29
  • 2012-07-16
  • 2012-02-09
相关资源
最近更新 更多