在Centos Docker镜像中更新PATH(替代Dockerfile ENV)

时间:2018-03-08 10:18:54

标签: docker centos environment-variables packer

我正在使用Packer配置docker Centos映像并使用bash脚本而不是Dockerfile来配置映像(这似乎是Packer方式)。我似乎无法弄清楚如何更新PATH变量,以便我的自定义二进制文件可以像这样执行:

docker run -i -t <container> my_binary

我尝试将.sh文件放在/etc/profile.d/文件夹中,并直接写入/etc/environment,但这些似乎都没有生效。

我怀疑它与Docker在一次性容器中执行命令时使用的内容有关。我认为这是Bourne Shell,但如前所述,/etc/profile.d//etc/environment方法都不起作用。

更新

据我所知,由于@tgogos answer中解释的原因,无法在正在运行的容器中更改环境变量。但是我不认为这是我的问题,因为在Packer完成配置映像之后,它会提交并上传到Docker Hub。更准确的例子如下:

$ docker run -itd --name test centos:6
$ docker exec -it test /bin/bash
[root@006a9c3195b6 /]# echo 'echo SUCCESS' > /root/test.sh  
[root@006a9c3195b6 /]# chmod +x /root/test.sh
[root@006a9c3195b6 /]# echo 'export PATH=/root:$PATH' > /etc/profile.d/my_settings.sh
[root@006a9c3195b6 /]# echo 'PATH=/root:$PATH' > /etc/environment
[root@006a9c3195b6 /]# exit
$ docker commit test test-image:1
$ docker exec -it test-image:1 test.sh

期待看到SUCCESS已打印但正在

OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"test.sh\": executable file not found in $PATH": unknown

更新2

我在〜/ .bashrc中更新了PATH,它允许我执行以下命令:

$ docker run -it test-image:1 /bin/bash
[root@8f821c7b9b82 /]# test.sh 
SUCCESS

但是,运行docker run -it test-image:1 test.sh仍会导致

docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: ...

我可以确认我的图像CMD设置为“/ bin / bash”。那么有人可以解释为什么运行docker run -it test-image:1 test.sh不会导致~/.bashrc

2 个答案:

答案 0 :(得分:0)

/etc/profile仅在登录shell调用时由bash读取。

有关bash在启动时读取哪些文件的详细信息,请参阅此article

编辑:如果您将示例中的最后一行更改为: docker exec -it test bash -lc test.sh它可以按预期工作。

答案 1 :(得分:0)

提到了一些好处:

@BMitch提到的地方:

  

使用docker run -e ...销毁容器并使用新环境变量启动新容器。它与在正在运行的进程中更改环境变量完全相同,您可以将其停止并使用传入的新值重新启动。

在评论部分,他补充道:

  

Docker没有提供修改正在运行的容器中的环境变量的方法,因为操作系统没有提供在正在运行的进程中修改环境变量的方法。你需要销毁并重新创建。

更新(请参阅评论部分)

您可以使用

docker commit --change "ENV PATH=your_new_path_here" test test-image:1