使用exec丢失PATH环境变量进入docker容器

时间:2017-12-28 14:31:37

标签: docker environment-variables ros

这是我的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进程?

3 个答案:

答案 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中设置的一样