我为自己建立了一个ROS形象。我在主机上安装原始主页时运行它,并获得一些技巧来获取图形。在docker中启动shell后,我总是需要执行两个源命令。其中一个要获取的文件实际上位于容器内,但另一个文件位于我的家中,只有在启动容器时才会挂载。我会自动获取这两个文件。
我尝试添加
RUN bash -c "source /opt/ros/indigo/setup.bash"
到图像文件,但实际上并没有获取它。使用CMD
而不是运行没有把我放到容器的shell中(我假设它已经完成执行源然后退出了?)。我甚至不知道如何获取仅在启动后可用的文件。我需要做什么?
答案 0 :(得分:1)
TL; DR:您需要在CMD
或ENTRYPOINT
中执行此步骤,对于类似源命令的内容,您需要在shell中执行此步骤以运行您的应用或者你喜欢的任何外壳。如果您只想要一个bash shell作为命令,那么将source
命令放在类似.bashrc
文件的内容中。或者你可以运行类似的东西:
bash -c "source /opt/ros/indigo/setup.bash && bash"
作为你的命令。
其中一个要获取的文件实际上位于容器内,但另一个文件位于我的家中,只有在启动容器时才会挂载。
...
我尝试将...添加到图片文件
使用临时容器构建映像,这些容器只能看到Dockerfile指令以及与之一起发送的上下文以运行构建。容器使用构建的映像和所有配置(如卷)来运行应用程序。这两个步骤之间有一个硬分隔符,即图像构建和容器运行,并且在该图像构建步骤中您的卷不可用。
为映像构建执行的每个RUN
步骤都是在一个临时容器中完成的,该容器仅在文件系统完成时存储文件系统的输出。对您的环境所做的更改,CD进入另一个目录,在后台生成进程或服务,或者当RUN
生成的命令退出时未写入文件系统的任何其他内容都将丢失。这是您在单个长RUN
命令中看到链接在一起的命令的一个原因,这就是为什么在Dockerfile中有ENV
和WORKDIR
命令的原因。