保存Dockerfile环境变量以备将来使用
我想将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
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版本本身是否会这样做。但运行旧的缓存映像可能会导致错误。也就是说,你不是第一个看到它的人,但是每个报告它的人都无法缩小范围或复制它。