【问题标题】:Saving Dockerfile ENV variables for future use保存 Dockerfile ENV 变量以供将来使用
【发布时间】:2018-08-03 10:39:37
【问题描述】:

我想将 Dockerfile 中设置的 PATHLD_LIBRARY_PATH 保存到 .bashrc 以供将来使用。 但是,看起来PATH 已正确保存,但LD_LIBRARY_PATH 未正确保存 例如,以下简单的 Dockerfile 将这些变量保存到临时文件中:

FROM nvidia/cuda:9.0-devel-centos7 AS devel
ENV PATH=/opt/pgi/linux86-64/18.4/bin:$PATH
ENV LD_LIBRARY_PATH=/opt/pgi/linux86-64/18.4/lib:$LD_LIBRARY_PATH
RUN touch mylibpath && \
    touch mybinpath && \
    echo $PATH >> mybinpath && \
    echo $LD_LIBRARY_PATH >> mylibpath

结果是PATH 具有正确的值,而LD_LIBRARY_PATH 为空白,如下所示。 但是,如果我将 LD_LIBRARY_PATH 重命名为 ALD_LIBRARY_PATH 之类的名称,它会打印出正确的值。 我错过了什么?

================Before renaming =======================

$ sudo docker build --no-cache -t dshawul/acecast:latest .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM nvidia/cuda:9.0-devel-centos7 AS devel
 ---> 96c10ed77499
Step 2/4 : ENV PATH /opt/pgi/linux86-64/18.4/bin:$PATH
 ---> Running in 2e3cf9a3ad64
 ---> cd56324327ab
Removing intermediate container 2e3cf9a3ad64
Step 3/4 : ENV LD_LIBRARY_PATH /opt/pgi/linux86-64/18.4/lib:$LD_LIBRARY_PATH
 ---> Running in d228c9421efc
 ---> 43c2d0043ff5
Removing intermediate container d228c9421efc
Step 4/4 : RUN touch mylibpath &&     touch mybinpath &&     echo $PATH >> mybinpath &&     echo $LD_LIBRARY_PATH >> mylibpath
 ---> Running in 52ba4a205815
 ---> e9aede6ab347
Removing intermediate container 52ba4a205815
Successfully built e9aede6ab347
Successfully tagged dshawul/acecast:latest

$ sudo docker run -it dshawul/acecast:latest
[root@efdfdcf693d9 /]# cat mybinpath
/opt/pgi/linux86-64/18.4/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@efdfdcf693d9 /]# cat mylibpath

[root@efdfdcf693d9 /]# exit
exit

==================After renaming ==============================

$ sudo docker build --no-cache -t dshawul/acecast:latest .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM nvidia/cuda:9.0-devel-centos7 AS devel
 ---> 96c10ed77499
Step 2/4 : ENV PATH /opt/pgi/linux86-64/18.4/bin:$PATH
 ---> Running in 3628b77881b4
 ---> c98fc82bba60
Removing intermediate container 3628b77881b4
Step 3/4 : ENV ALD_LIBRARY_PATH /opt/pgi/linux86-64/18.4/lib:$ALD_LIBRARY_PATH
 ---> Running in 5eea6a5675c0
 ---> 7da3fb187682
Removing intermediate container 5eea6a5675c0
Step 4/4 : RUN touch mylibpath &&     touch mybinpath &&     echo $PATH >> mybinpath &&     echo $ALD_LIBRARY_PATH >> mylibpath
 ---> Running in ebdfdd5e3762
 ---> c175b1fbd2c1
Removing intermediate container ebdfdd5e3762
Successfully built c175b1fbd2c1
Successfully tagged dshawul/acecast:latest

$ sudo docker run -it dshawul/acecast:latest
[root@9cd1ed4fdf3a /]# cat mybinpath
/opt/pgi/linux86-64/18.4/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@9cd1ed4fdf3a /]# cat mylibpath
/opt/pgi/linux86-64/18.4/lib:
[root@9cd1ed4fdf3a /]# exit
exit

==========================================================

【问题讨论】:

    标签: docker environment-variables dockerfile


    【解决方案1】:

    在您的Dockerfile 中,如果您只是将软件安装到/usr/bin/usr/lib 之类的目录中,这些目录已经在$PATH/etc/ld.so.conf 中,那么这是最简单的。由于您描述的是在隔离文件系统中运行的东西上的可重现构建过程,因此您并没有真正“污染已安装的操作系统”。

    我已经看到 some hints that Docker 可能会默默地剥离、忽略或重置 LD_LIBRARY_PATH 环境变量,尽管我找不到明确的文档说明。

    【讨论】:

      【解决方案2】:

      您的环境中发生了其他事情,可能是缓存的图像,因为我无法重现您的问题:

      $ cat df.so-51670836
      FROM nvidia/cuda:9.0-devel-centos7 AS devel
      ENV PATH=/opt/pgi/linux86-64/18.4/bin:$PATH
      ENV LD_LIBRARY_PATH=/opt/pgi/linux86-64/18.4/lib:$LD_LIBRARY_PATH
      RUN touch mylibpath && \
          touch mybinpath && \
          echo $PATH >> mybinpath && \
          echo $LD_LIBRARY_PATH >> mylibpath
      
      $ docker build -t so-51670836 -f df.so-51670836 .
      Sending build context to Docker daemon  23.04kB
      Step 1/4 : FROM nvidia/cuda:9.0-devel-centos7 AS devel
       ---> 96c10ed77499
      Step 2/4 : ENV PATH=/opt/pgi/linux86-64/18.4/bin:$PATH
       ---> Running in c152383485fd
      Removing intermediate container c152383485fd
       ---> c47e029b5e50
      Step 3/4 : ENV LD_LIBRARY_PATH=/opt/pgi/linux86-64/18.4/lib:$LD_LIBRARY_PATH
       ---> Running in b58a94b16980
      Removing intermediate container b58a94b16980
       ---> 3c02bc748518
      Step 4/4 : RUN touch mylibpath &&     touch mybinpath &&     echo $PATH >> mybinpath &&     echo $LD_LIBRARY_PATH >> mylibpath
       ---> Running in e81f4e821d28
      Removing intermediate container e81f4e821d28
       ---> f5c5c2868350
      Successfully built f5c5c2868350
      Successfully tagged so-51670836:latest
      
      $ docker run -it --rm so-51670836
      [root@dfcb06ce3ac1 /]# cat my
      mybinpath  mylibpath
      [root@dfcb06ce3ac1 /]# cat mylibpath
      /opt/pgi/linux86-64/18.4/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
      [root@dfcb06ce3ac1 /]# cat mybinpath
      /opt/pgi/linux86-64/18.4/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      [root@dfcb06ce3ac1 /]# exit
      exit
      
      $ docker version
      Client:
       Version:           18.06.0-ce
       API version:       1.38
       Go version:        go1.10.3
       Git commit:        0ffa825
       Built:             Wed Jul 18 19:09:33 2018
       OS/Arch:           linux/amd64
       Experimental:      true
      
      Server:
       Engine:
        Version:          18.06.0-ce
        API version:      1.38 (minimum version 1.12)
        Go version:       go1.10.3
        Git commit:       0ffa825
        Built:            Wed Jul 18 19:07:38 2018
        OS/Arch:          linux/amd64
        Experimental:     true
      

      【讨论】:

      • 我有一个不同的版本,也许这就是问题所在。 $ sudo snap refresh --beta docker docker (beta) 17.09.1-ce from 'docker-inc' refreshed
      • 确实,我升级到 18.06 突然就可以了。也可能是旧的 17.09 正在工作,但缓存搞砸了它(有一些图像)并且重新启动服务会起作用。
      • @danny github 上到处都有图像设置这个变量,无论是旧的还是最近的,所以我怀疑 docker 版本本身是否做到了这一点。但是运行旧的缓存图像可能会。也就是说,您不是第一个看到它的人,但报告它的每个人都无法缩小范围或重现它。
      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 2021-12-13
      • 2023-04-01
      相关资源
      最近更新 更多