我是 docker 新手,我遇到了 dockerfile 中 ENTRYPOINT 参数的问题。我正在开发一个名为 F1Tenth 的项目,我正在使用他们的预制 docker 映像。我正在 jetson nano 上运行它,我试图弄清楚如何为 ROS2 获取这两个文件(
/opt/ros/foxy/setup.bash
和 install/local_setup.bash
)。经过一番研究后,我认为最好的办法是运行一个获取这些资源的脚本,并使用 ENTRYPOINT 运行该脚本。我尝试了很多东西,但没有任何效果,当容器启动时,我仍然需要在终端中手动获取文件。我需要这个才能工作,因为 jetson 将连接到遥控汽车上,并且它需要无头且不需要 ssh。
这是我的entrypoint.sh(位于docker镜像目录的内部)
#!/bin/bash
source /opt/ors/foxy/setup.bash
source install/local_setup.bash
exec "$@"
这是我的 DockerFile:
FROM ros:foxy
SHELL \["/bin/bash", "-c"\]
# dependencies
RUN apt-get update --fix-missing && \
apt-get install -y git \
nano \
vim \
python3-pip \
libeigen3-dev \
tmux \
ros-foxy-rviz2
RUN apt-get -y dist-upgrade
RUN pip3 install transforms3d
# f1tenth gym
RUN git clone https://github.com/f1tenth/f1tenth_gym
RUN cd f1tenth_gym && \
pip3 install -e .
# ros2 gym bridge
RUN mkdir -p sim_ws/src/f1tenth_gym_ros
COPY . /sim_ws/src/f1tenth_gym_ros
RUN source /opt/ros/foxy/setup.bash && \
cd sim_ws/ && \
apt-get update --fix-missing && \
rosdep install -i --from-path src --rosdistro foxy -y && \
colcon build
WORKDIR '/sim_ws'
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD ["/bin/bash"]
我尝试过各种其他 DockerFile 设置。也许我误解了 ENTRYPOINT 的意义
在您的
entrypoint.sh
中,您引用了/opt/ors/foxy/setup.bash
,但我只能在图像上找到/opt/ros/foxy/setup.bash
(它们在路径的第二部分有所不同)。我假设这是一个拼写错误,您指的是后一个文件。这也是您在文本中提到的路径。
所以我建议按如下方式更改您的
entrypoint.sh
:
#!/bin/bash
source /opt/ros/foxy/setup.bash
source install/local_setup.bash
exec "$@"
我也摆弄了一点
Dockerfile
。如果您来源 SHELL
而不是 /opt/ros/foxy/setup.sh
,则无需更改 /opt/ros/foxy/setup.bash
。还把 WORKDIR
移到了更早的位置,这意味着您不需要 cd sim_ws/
。
您不需要进行这些更改,更新后的
entrypoint.sh
应足以使映像成功构建和运行。
FROM ros:foxy
RUN apt-get update --fix-missing && \
apt-get install -y git \
nano \
vim \
python3-pip \
libeigen3-dev \
tmux \
ros-foxy-rviz2 && \
apt-get -y dist-upgrade && \
pip3 install transforms3d
RUN git clone https://github.com/f1tenth/f1tenth_gym
RUN cd f1tenth_gym && \
pip3 install -e .
RUN mkdir -p sim_ws/src/f1tenth_gym_ros
COPY . /sim_ws/src/f1tenth_gym_ros
WORKDIR /sim_ws
RUN . /opt/ros/foxy/setup.sh && \
apt-get update --fix-missing && \
rosdep install -i --from-path src --rosdistro foxy -y && \
colcon build
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD ["/bin/bash"]
我还注意到,您两次获取
/opt/ros/foxy/setup.bash
脚本,一次在 Dockerfile
本身,然后再次通过 entrypoint.sh
脚本。这是故意的吗?真的有必要吗?