`由于有多个From,在我的docker容器中找不到bash:webots:command`

`由于有多个From,在我的docker容器中找不到bash:webots:command`,docker,dockerfile,webots,Docker,Dockerfile,Webots,我有一个安装了Webots和ROS2的docker容器。但是,在容器内运行webots会返回bash:webots:command not found。为什么? 运行webots(但不运行ROS2)的容器 这里有一个从运行的容器,确实成功运行了webots(但缺少我需要的ROS2): $xhost+local:root>/dev/null 2>&1,所以webots不会说无法加载Qt平台插件“xcb” $docker run-it-e DISPLAY-v/tmp/.X11 unix:/tmp/.

我有一个安装了Webots和ROS2的docker容器。但是,在容器内运行
webots
会返回
bash:webots:command not found
。为什么?

运行
webots
(但不运行ROS2)的容器 这里有一个从运行的容器,确实成功运行了
webots
(但缺少我需要的ROS2):

$xhost+local:root>/dev/null 2>&1,所以webots不会说无法加载Qt平台插件“xcb”
$docker run-it-e DISPLAY-v/tmp/.X11 unix:/tmp/.X11 unix:rw-cyberbotics/webots:R2021a-ubuntu20.04
不运行
webots的容器

这是我的docker容器,它没有成功运行
webots
,而是说
bash:webots:command NOT found
。但是,它确实成功地运行了(我认为问题与我如何从两个容器继承有关,因为如果我从
语句中交换两个
ARG
的顺序,
webots
被找到了,但
ros2
没有。不过我不确定解决方案):

Dockerfile launch.sh(用于启动docker容器) 总结
如您所见,两个容器都使用
cyberbotics/webots:R2021a-ubuntu20.04
,第二个容器使用第一个容器的所有选项,但有一些额外的选项。为什么第一个容器成功运行了
webots
,而第二个容器却找不到该命令?

当您有多个
FROM
命令时,您并没有将它们的两个内容“继承”到同一个映像中,而是在执行一个操作。这允许您指定
--from
选项,从该阶段复制
。默认情况下,Dockerfile中的最后一个阶段将是目标(因此,在您的示例中,您实际上只使用ros2映像。webots映像在那里没有实际使用

这里有两个选项:

  • 使用
    Copy--from=base
  • 这可能很难做到,也很挑剔。您需要复制所有依赖项;如果它们是通过您的包管理器(apt get)获取的,则会使dpkg的本地数据库不一致

  • 复制一个
    Dockerfile
    s,并将其

  • 只要它们使用相同的基本发行版,这可能会很好。您可以进入项目的一个存储库,获取它们的
    Dockerfile
    ,从另一个映像重建它-只需更改,例如,
    cyberbotics/webots:R2021a-ubuntu20.04
    的Dockerfile,即可从Niurver/ros2\u foxy:latest获得
    ode>。这可能需要修改那里的其他命令。

    我最终使用了莱昂纳多·达尼诺的建议,并且成功了。我不得不复制几个连续的ROS2容器的内容,以使树层次结构脱离webots基础图像,但它让我达到了我的目的。为了繁荣,这里有一个完整的新Dockerfile:

    # Use Webots docker container as base
    ARG BASE_IMAGE_WEBOTS=cyberbotics/webots:R2021a-ubuntu20.04
    FROM $BASE_IMAGE_WEBOTS AS base
    
    # ==================================================================================
    # niurover/ros2_foxy uses osrf/ros:foxy-desktop as its base, so I need to add code from
    # container heirarchy all the way back to where it can stem off of `base` from above
    # ==================================================================================
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for ros:foxy-ros-core-focal found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/ros-core/Dockerfile
    # ----------------------------------------------------------------------------------
    
    ## setup timezone   # NOTE commented out since timezone should already be set up
    #RUN echo 'Etc/UTC' > /etc/timezone && \
    #    ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
    #    apt-get update && \
    #    apt-get install -q -y --no-install-recommends tzdata && \
    #    rm -rf /var/lib/apt/lists/*
    
    # install packages
    RUN apt-get update && apt-get install -q -y --no-install-recommends \
        dirmngr \
        gnupg2 \
        && rm -rf /var/lib/apt/lists/*
    
    # setup keys
    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    
    # setup sources.list
    RUN echo "deb http://packages.ros.org/ros2/ubuntu focal main" > /etc/apt/sources.list.d/ros2-latest.list
    
    # setup environment
    ENV LANG C.UTF-8
    ENV LC_ALL C.UTF-8
    
    ENV ROS_DISTRO foxy
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-ros-core=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    ## setup entrypoint # NOTE ignore this part of their Dockerfile
    #COPY ./ros_entrypoint.sh /
    #
    #ENTRYPOINT ["/ros_entrypoint.sh"]
    #CMD ["bash"]
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for ros:foxy-ros-base-focal found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/ros-base/Dockerfile
    # ----------------------------------------------------------------------------------
    
    # install bootstrap tools
    RUN apt-get update && apt-get install --no-install-recommends -y \
        build-essential \
        git \
        python3-colcon-common-extensions \
        python3-colcon-mixin \
        python3-rosdep \
        python3-vcstool \
        && rm -rf /var/lib/apt/lists/*
    
    # bootstrap rosdep
    RUN rosdep init && \
      rosdep update --rosdistro $ROS_DISTRO
    
    # setup colcon mixin and metadata
    RUN colcon mixin add default \
          https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml && \
        colcon mixin update && \
        colcon metadata add default \
          https://raw.githubusercontent.com/colcon/colcon-metadata-repository/master/index.yaml && \
        colcon metadata update
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-ros-base=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for osrf/ros:foxy-desktop-focal (or is it osrf/ros:foxy-desktop?) found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/desktop/Dockerfile 
    # ----------------------------------------------------------------------------------
      
    # This is an auto generated Dockerfile for ros:desktop
    # generated from docker_images_ros2/create_ros_image.Dockerfile.em
    #FROM ros:foxy-ros-base-focal   # NOTE commented out since satisfied by above
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-desktop=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for niurover/ros2_foxy found at:
    # https://github.com/NIURoverTeam/Dockerfiles/blob/master/ros2_foxy/Dockerfile
    # ----------------------------------------------------------------------------------
    #ARG BASE_IMAGE=osrf/ros:foxy-desktop   # NOTE commented out since satisfied by above
    
    # Install work packages
    #FROM $BASE_IMAGE as base   # NOTE commented out since satisfied by above
    RUN apt-get update && apt-get upgrade -y && apt-get install -y \
            tmux \
            curl \
            wget \
            vim \
            sudo \
            unzip \
            python3-pip \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    # Install ROS Packages
    RUN apt-get update && apt-get install -y \
            ros-foxy-turtlesim \
            ~nros-foxy-rqt* \
            ros-foxy-teleop-tools \
            ros-foxy-joy-linux \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    RUN pip3 install pyserial
    
    #CMD ["bash"]   # NOTE ignore this part of the Dockerfile
    
    # ----------------------------------------------------------------------------------
    # new stuff added on top of niurover/ros2_foxy to assist with Webots + ROS2
    # ----------------------------------------------------------------------------------
    
    # resolve a missing dependency for webots demo
    RUN apt-get update && apt-get install -y \
            libxtst6 \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    # Finally open a bash command to let the user interact
    CMD ["/bin/bash"]
    

    您是否设置了
    WEBOTS\u HOME
    环境变量?您是否尝试使用
    /usr/local/WEBOTS/WEBOTS
    启动WEBOTS?@OlivierMichel
    /usr/local/WEBOTS/
    没有这样的文件或目录,并且
    导出WEBOTS\u HOME=/usr/local/WEBOTS
    没有多大帮助。我认为这个问题与我是如何从两个容器。如果我交换我的两个
    ARG
    FROM
    语句的顺序,
    webots
    被找到,但是
    ros2
    没有。我会将此信息添加到帖子中。谢谢你的评论。我同意选项1似乎很挑剔。至于选项2,有没有办法不重复代码?我有纽罗孚/ros2\u foxy的Dockerfile文件,但我不愿意只复制粘贴内容并为自己制造可维护性问题。有什么方法可以避免这种情况吗?可能是docker compose或一些bash技巧(修改ARG)?老实说,我想不出一个好办法。你可以做一些像
    sed s/FROM/FROM-cyberbotics/webots:R2021a-ubuntu20.04/
    ,但这不包括除了更改基本映像之外你可能需要做的任何其他更改。对我来说,复制dockerfile看起来是最简单的选择。我最终选择了你的选项2和它起作用了。我不得不在ROS2依赖关系树上做一些调整,以使基本发行版对齐,但它完成了工作。如果您想查看完整的Dockerfile,我将它放在单独的答案中,并接受了您的答案。感谢您的帮助!
    #! /bin/bash
     
    CONTAINER_USER=$USER
    CONTAINER_NAME=webots_ros2_foxy
    USER_ID=$UID
    IMAGE=niurover/webots_ros2_foxy:latest
    if [ $(uname -r | sed -n 's/.*\( *Microsoft *\).*/\1/ip') ];
    then
        xhost +local:$CONTAINER_USER
        xhost +local:root
    fi
    
    sudo docker run -it --rm \
        --name $CONTAINER_NAME \
        --user=$USER_ID\
        --env="DISPLAY" \
        --env="CONTAINER_NAME=$CONTAINER_NAME" \
        --workdir="/home/$CONTAINER_USER" \
        --volume="/home/$CONTAINER_USER:/home/$CONTAINER_USER" \
        --volume="/etc/group:/etc/group:ro" \
        --volume="/etc/passwd:/etc/passwd:ro" \
        --volume="/etc/shadow:/etc/shadow:ro" \
        --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
        --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
        $IMAGE bash\
    
    if [ $(uname -r | sed -n 's/.*\( *Microsoft *\).*/\1/ip') ];
    then
        xhost -local:$CONTAINER_USER
        xhost -local:root
    fi
    
    # Use Webots docker container as base
    ARG BASE_IMAGE_WEBOTS=cyberbotics/webots:R2021a-ubuntu20.04
    FROM $BASE_IMAGE_WEBOTS AS base
    
    # ==================================================================================
    # niurover/ros2_foxy uses osrf/ros:foxy-desktop as its base, so I need to add code from
    # container heirarchy all the way back to where it can stem off of `base` from above
    # ==================================================================================
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for ros:foxy-ros-core-focal found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/ros-core/Dockerfile
    # ----------------------------------------------------------------------------------
    
    ## setup timezone   # NOTE commented out since timezone should already be set up
    #RUN echo 'Etc/UTC' > /etc/timezone && \
    #    ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
    #    apt-get update && \
    #    apt-get install -q -y --no-install-recommends tzdata && \
    #    rm -rf /var/lib/apt/lists/*
    
    # install packages
    RUN apt-get update && apt-get install -q -y --no-install-recommends \
        dirmngr \
        gnupg2 \
        && rm -rf /var/lib/apt/lists/*
    
    # setup keys
    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    
    # setup sources.list
    RUN echo "deb http://packages.ros.org/ros2/ubuntu focal main" > /etc/apt/sources.list.d/ros2-latest.list
    
    # setup environment
    ENV LANG C.UTF-8
    ENV LC_ALL C.UTF-8
    
    ENV ROS_DISTRO foxy
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-ros-core=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    ## setup entrypoint # NOTE ignore this part of their Dockerfile
    #COPY ./ros_entrypoint.sh /
    #
    #ENTRYPOINT ["/ros_entrypoint.sh"]
    #CMD ["bash"]
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for ros:foxy-ros-base-focal found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/ros-base/Dockerfile
    # ----------------------------------------------------------------------------------
    
    # install bootstrap tools
    RUN apt-get update && apt-get install --no-install-recommends -y \
        build-essential \
        git \
        python3-colcon-common-extensions \
        python3-colcon-mixin \
        python3-rosdep \
        python3-vcstool \
        && rm -rf /var/lib/apt/lists/*
    
    # bootstrap rosdep
    RUN rosdep init && \
      rosdep update --rosdistro $ROS_DISTRO
    
    # setup colcon mixin and metadata
    RUN colcon mixin add default \
          https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml && \
        colcon mixin update && \
        colcon metadata add default \
          https://raw.githubusercontent.com/colcon/colcon-metadata-repository/master/index.yaml && \
        colcon metadata update
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-ros-base=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for osrf/ros:foxy-desktop-focal (or is it osrf/ros:foxy-desktop?) found at:
    # https://github.com/osrf/docker_images/blob/master/ros/foxy/ubuntu/focal/desktop/Dockerfile 
    # ----------------------------------------------------------------------------------
      
    # This is an auto generated Dockerfile for ros:desktop
    # generated from docker_images_ros2/create_ros_image.Dockerfile.em
    #FROM ros:foxy-ros-base-focal   # NOTE commented out since satisfied by above
    
    # install ros2 packages
    RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-foxy-desktop=0.9.2-1* \
        && rm -rf /var/lib/apt/lists/*
    
    # ----------------------------------------------------------------------------------
    # taken from Dockerfile for niurover/ros2_foxy found at:
    # https://github.com/NIURoverTeam/Dockerfiles/blob/master/ros2_foxy/Dockerfile
    # ----------------------------------------------------------------------------------
    #ARG BASE_IMAGE=osrf/ros:foxy-desktop   # NOTE commented out since satisfied by above
    
    # Install work packages
    #FROM $BASE_IMAGE as base   # NOTE commented out since satisfied by above
    RUN apt-get update && apt-get upgrade -y && apt-get install -y \
            tmux \
            curl \
            wget \
            vim \
            sudo \
            unzip \
            python3-pip \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    # Install ROS Packages
    RUN apt-get update && apt-get install -y \
            ros-foxy-turtlesim \
            ~nros-foxy-rqt* \
            ros-foxy-teleop-tools \
            ros-foxy-joy-linux \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    RUN pip3 install pyserial
    
    #CMD ["bash"]   # NOTE ignore this part of the Dockerfile
    
    # ----------------------------------------------------------------------------------
    # new stuff added on top of niurover/ros2_foxy to assist with Webots + ROS2
    # ----------------------------------------------------------------------------------
    
    # resolve a missing dependency for webots demo
    RUN apt-get update && apt-get install -y \
            libxtst6 \
            && apt-get clean \
            && rm -rf /var/lib/apt/lists/*
    
    # Finally open a bash command to let the user interact
    CMD ["/bin/bash"]