我需要下载一个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
。
该值需要是动态的,因为它可能会发生变化。
您无法将
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}