保存Dockerfile环境变量以备将来使用

保存Dockerfile环境变量以备将来使用,docker,environment-variables,dockerfile,Docker,Environment Variables,Dockerfile,我想将Dockerfile中设置的PATH和LD\u LIBRARY\u PATH保存到.bashrc以备将来使用。 但是,看起来PATH已正确保存,但未正确保存LD\u LIBRARY\u 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

我想将Dockerfile中设置的
PATH
LD\u LIBRARY\u PATH
保存到.bashrc以备将来使用。 但是,看起来
PATH
已正确保存,但未正确保存
LD\u LIBRARY\u 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\u LIBRARY\u PATH
为空,如下所示。 但是如果我将
LD\u LIBRARY\u PATH
重命名为类似
ALD\u LIBRARY\u 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

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

Dockerfile
中,如果您只需将软件安装到
/usr/bin
/usr/lib
等目录中,这是最简单的,这些目录已经位于
$PATH
/etc/ld.so.conf
中。因为您描述的是一个可复制的构建过程,它将在一个隔离的文件系统中运行,所以您并没有真正“污染已安装的操作系统”


我看到Docker可能会悄悄地剥离、忽略或重置
LD\u LIBRARY\u PATH
环境变量,尽管我找不到明确的文档说明这一点。

您的环境中还有其他问题,可能是缓存的图像,因为我无法重现您的问题:

$ 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从“docker inc”刷新事实上,我升级到18.06,它突然工作了。也可能是旧版17.09正常工作,但缓存弄乱了它(有一些图像),重新启动服务也会正常工作。@danny github上到处都有图像设置这个变量,包括旧的和新的,所以我怀疑docker版本本身是否会这样做。但运行旧的缓存映像可能会导致错误。也就是说,你不是第一个看到它的人,但是每个报告它的人都无法缩小范围或复制它。