我正在使用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
?
答案 0 :(得分:0)
/etc/profile
仅在登录shell调用时由bash读取。
有关bash在启动时读取哪些文件的详细信息,请参阅此article。
编辑:如果您将示例中的最后一行更改为:
docker exec -it test bash -lc test.sh
它可以按预期工作。
答案 1 :(得分:0)
提到了一些好处:
How to set an environment variable in a running docker container(另请查看相关github问题的链接)。
@BMitch提到的地方:
使用
docker run -e ...
销毁容器并使用新环境变量启动新容器。它与在正在运行的进程中更改环境变量完全相同,您可以将其停止并使用传入的新值重新启动。
在评论部分,他补充道:
Docker没有提供修改正在运行的容器中的环境变量的方法,因为操作系统没有提供在正在运行的进程中修改环境变量的方法。你需要销毁并重新创建。
更新(请参阅评论部分)
您可以使用
docker commit --change "ENV PATH=your_new_path_here" test test-image:1