【问题标题】:Dockerfile RUN command stops working after ROS installROS 安装后 Dockerfile RUN 命令停止工作
【发布时间】:2020-12-02 22:31:04
【问题描述】:

我正在按照 dockerfile 中http://wiki.ros.org/noetic/Installation/Ubuntu 的说明安装 ROS。安装后,使用“source /opt/ros/noetic/setup.bash”设置环境。但是,在我这样做之后,dockerfile 中的每个 RUN 命令都会停止正常工作。

在下面的 dockerfile 中,第一个 'ls /' 会产生预期的输出,但第二个不会。这不是特定于“ls”的,这只是问题的演示;我在 ROS 环境后运行的每个命令都没有预期的效果。 ROS 环境设置中发生了什么来破坏它,我该如何防止它?在设置 ROS 后,我还有很多其他设置需要进行。

FROM ubuntu:20.04

# Dependencies
RUN apt-get update && apt-get install -y lsb-release && apt-get clean all
RUN apt-get install -y gnupg2

# Set timezone so tzdata is not interactive during install
ENV TZ=America/New_York
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# Install ROS, from http://wiki.ros.org/noetic/Installation/Ubuntu
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 && \
    apt-get update && \
    apt install -qq -y ros-noetic-ros-base

RUN apt-get install -y python3-pip
RUN python3 -m pip install rospkg

RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

# This DOES produce what you would think
RUN ls /

SHELL ["/bin/bash", "-c", "source ~/.bashrc"]

# This DOES NOT produce what you would think
RUN ls /

【问题讨论】:

    标签: docker ros


    【解决方案1】:

    Dockerfile SHELL 指令更改用于解释 RUN 命令的 shell。默认是["/bin/sh", "-c"],所以你得到

    # These two commands are identical with the default SHELL
    RUN ls /
    RUN ["/bin/sh", "-c", "ls /"]
    

    当你写 SHELL 时,你会得到

    SHELL ["/bin/bash", "-c", "source ~/.bashrc"]
    RUN ls /
    # Equivalently:
    RUN ["/bin/bash", "-c", "source ~/.bashrc", "ls /"]
    

    然而,sh -c 选项读取一个单个命令字并执行它;任何其他选项都将被忽略(大多数情况下;命令字将它们视为$1 位置参数)。

    大多数情况下,在 Docker 中,像 .bashrc 这样的 shell 点文件会被完全忽略。使用ENV 指令设置环境变量更好。对于单个主容器进程,您还可以使用入口点包装脚本来加载变量文件,但这在容器构建期间或docker exec 调试 shell 中不起作用。

    您可以利用sh -c 的特定语义,并且知道该命令将作为单个附加参数传递,然后说

    SHELL ["/bin/bash", "-c", ". ~/.bashrc && $1"]
    

    source in every Dockerfile RUN call 而不是suggests

    # Tell bash these are "login" shells and _should_ read shell dotfiles
    SHELL ["/bin/bash", "--login", "-c"]
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2020-11-18
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多