这是我的Dockerfile:
FROM ros:kinetic-ros-core-xenial
CMD ["bash"]
如果我运行docker build -t ros . && docker run -it ros
,然后从容器echo $PATH
中运行,我会得到:
/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
如果我exec
进入容器(docker exec -it festive_austin bash
)并运行echo $PATH
,我会得到:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
为什么环境变量不同?如何在具有相同初始环境的容器上获得新的bash进程?
答案 0 :(得分:3)
The ENTRYPOINT
command is only invoked on docker run
, not on docker exec
.
我假设这个/ros_entrypoint.sh
脚本负责向PATH
添加内容。如果是这样,那么你可以对docker exec
执行类似的操作:
docker exec -it <CONTAINER_ID> /ros_entrypoint.sh bash
答案 1 :(得分:2)
docker exec
仅使用指令ENV
获取Dockerfile中定义的环境变量。使用docker exec [...] bash
,您还可以在bash
的某处定义。
将此行添加到Dockerfile:
ENV PATH=/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
或更短:
ENV PATH=/opt/ros/kinetic/bin:$PATH
答案 2 :(得分:0)
这是一个老问题,但由于这是谷歌指导我的地方,我想我会分享我最终使用的解决方案。
在您的入口点脚本中添加一个类似于此的部分:
cat >> ~/.bashrc << EOF
export PATH="$PATH"
export OTHER="$OTHER"
EOF
一旦你重建了你的镜像,你就可以 exec 到你的容器中(注意 bash 是在交互模式下调用的):
docker run -d --rm --name container-name your_image
docker exec -it container-name /bin/bash -i
如果你现在echo $PATH
,它应该和你在.bashrc
中设置的一样