【问题标题】:Entering docker container with exec losing PATH environment variable使用 exec 进入 docker 容器会丢失 PATH 环境变量
【发布时间】:2021-08-09 12:30:20
【问题描述】:

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

【问题讨论】:

    标签: docker environment-variables ros


    【解决方案1】:

    这是一个老问题,但由于这是谷歌指导我的地方,我想我会分享我最终使用的解决方案。

    在您的入口点脚本中添加一个类似于此的部分:

    cat >> ~/.bashrc << EOF
    export PATH="$PATH"
    export OTHER="$OTHER"
    EOF
    

    重建映像后,您可以在容器中执行(注意 bash 在交互模式下被调用):

    docker run -d --rm --name container-name your_image
    docker exec -it container-name /bin/bash -i
    

    如果你现在echo $PATH,它应该和你在.bashrc中设置的一样

    【讨论】:

      【解决方案2】:

      docker exec 仅获取 Dockerfile 中使用指令ENV 定义的环境变量。使用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
      

      【讨论】:

        【解决方案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
        

        【讨论】:

        • 环境变量似乎不受 ros_entrypoint 脚本的影响。我已经最小化了仍然重现问题的 Dockerfile。我相信this是源Dockerfile,没有其他ENTRYPOINTs
        • 忽略这一点,您的命令有效。我很困惑,因为如果我运行 exec,然后运行 ​​/ros_entrypoint.sh,一旦我输入 bash,它就不起作用了。知道这两者有什么区别吗?
        • @maged - 如果您查看ros_entrypoint.sh,您会看到sources 是一个神奇的脚本(可能设置了环境),然后execs 是脚本的参数。一旦你已经在 Bash 中,简单地调用脚本不会有任何效果(尽管我猜你可以 source 它)。
        猜你喜欢
        • 2015-04-27
        • 2020-10-26
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 1970-01-01
        相关资源
        最近更新 更多