将RUN命令生成的值传递给ENV

问题描述 投票:0回答:1

我需要下载一个oracle客户端,放在一个文件夹中,并将该文件夹的路径设置为环境变量。到目前为止我已经到了这里:

ENV ORACLE_DRIVER_PATH=test_value
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -P /opt/oracle/
RUN unzip /opt/oracle/instantclient*.zip -d /opt/oracle/ && rm /opt/oracle/instantclient*.zip
RUN echo temp=$(find /opt/oracle -name "instantclient*")
ENV ORACLE_DRIVER_PATH=$temp

但是这样变量 ORACLE_DRIVER_PATH 结果为空:如果我运行

sudo docker exec <container_id> env
我会看到
ORACLE_DRIVER_PATH=

我错过了什么?我希望看到

/opt/oracle/instantclient_21_13

该值需要是动态的,因为它可能会发生变化。

docker dockerfile environment-variables
1个回答
1
投票

您无法将

ENV
设置为命令的结果,并且
RUN export
的持续时间不会超出当前
RUN
指令。一般来说,你想要做的事情的模式是很难的。

由于您期望映像中只有一个版本的库,因此您可以做的一件事是使用

RUN
指令将其重命名为固定路径。然后您可以在 Dockerfile
ENV
指令中使用该固定路径。

RUN cd /opt/oracle \
  && unzip instantclient*.zip \
  && rm instantclient*.zip \
  && mv instantclient* instantclient
ENV ORACLE_DRIVER_PATH /opt/oracle/instantclient

看起来您正在下载的 URL 会生成一个可变版本,因此您的图像可能具有不同的库和不同的行为,具体取决于其构建时间。如果有提供固定版本的下载 URL,您可以将版本号指定为构建时

ARG
,现在您将知道每个需要的地方都有一个固定路径。

ARG ORACLE_INSTANTCLIENT_VERSION=21_13
RUN wget https://???/instantclient-basiclite-${ORACLE_INSTANTCLIENT_VERSION}-linuxx64.zip -P /opt/oracle/
RUN cd /opt/oracle \
  && unzip instantclient-basiclite-${ORACLE_INSTANTCLIENT_VERSION}-linuxx64.zip \
  && rm instantclient-basiclite-${ORACLE_INSTANTCLIENT_VERSION}-linuxx64.zip
ENV ORACLE_DRIVER_PATH /opt/oracle/instantclient_${ORACLE_INSTANTCLIENT_VERSION}
© www.soinside.com 2019 - 2024. All rights reserved.