Dockerfile创建一个文件,然后不存在

时间:2019-01-30 12:55:55

标签: docker

这只是Dockefile的一部分,使我感到困惑。顺便说一下,它还有一些额外的调试行。在第一行中,我创建/home/ubuntu/.bashrc。但是,在最后一行,它就像无法运行一样。

RUN echo 'source /opt/ros/kinetic/setup.bash' >> /home/ubuntu/.bashrc
RUN echo 'source /home/ubuntu/catkin_ws/devel/setup.bash' >> /home/ubuntu/.bashrc

RUN /bin/bash -c "echo 'export HOME=/home/ubuntu' >> /root/.bashrc && source /root/.bashrc"
RUN pwd
RUN cd ~ && pwd
RUN cat /home/ubuntu/.bashrc
RUN mkdir -p ~/catkin_ws/src
RUN source /home/ubuntu/.bashrc && \
  cd ~/catkin_ws/src && \
  /opt/ros/kinetic/bin/catkin_init_workspace && \
  cd ~/catkin_ws && \
  catkin_make

以下是输出:

Step 13/32 : RUN echo 'source /opt/ros/kinetic/setup.bash' >> /home/ubuntu/.bashrc
 ---> Using cache
 ---> a60c2d1482d8
Step 14/32 : RUN echo 'source /home/ubuntu/catkin_ws/devel/setup.bash' >> /home/ubuntu/.bashrc
 ---> Using cache
 ---> 3be964ee0c36
Step 15/32 : RUN /bin/bash -c "echo 'export HOME=/home/ubuntu' >> /root/.bashrc && source /root/.bashrc"
 ---> Using cache
 ---> 83cf2e5f4b1c
Step 16/32 : RUN pwd
 ---> Using cache
 ---> 40915ecc834d
Step 17/32 : RUN cd ~ && pwd
 ---> Using cache
 ---> 92f2cee78a48
Step 18/32 : RUN cat /home/ubuntu/.bashrc
 ---> Using cache
 ---> c8f467775b33
Step 19/32 : RUN mkdir -p ~/catkin_ws/src
 ---> Using cache
 ---> 53e5c403949f
Step 20/32 : RUN source /home/ubuntu/.bashrc &&   cd ~/catkin_ws/src &&   /opt/ros/kinetic/bin/catkin_init_workspace &&   cd ~/catkin_ws &&   catkin_make
 ---> Running in 708d485325e2
/bin/sh: 1: source: not found
The command '/bin/sh -c source /home/ubuntu/.bashrc &&   cd ~/catkin_ws/src &&   /opt/ros/kinetic/bin/catkin_init_workspace &&   cd ~/catkin_ws &&   catkin_make' returned a non-zero code: 127

自然地,这是我的错误,但是我看不到它,也没有理解上的空白。谢谢!

2 个答案:

答案 0 :(得分:1)

source不是有效的命令,它是内置的bash。

不是告诉您文件/home/ubuntu/.bashrc,而是source不是命令

只需将RUN参数放在sh脚本中,就可以正确地以#!/ bin / bash开始。 然后只需使用COPY将sh复制到容器中,然后使用RUN运行它。

别忘了授予exec对脚本的权限:

COPY script.sh /
RUN ["chmod", "+x", "/script.sh"]
RUN /script.sh

或者:

RUN /bin/bash -c "source ...."

答案 1 :(得分:1)

@michael_bitard指出,source是内置的bash。 ubuntu中的默认Shell为dash,如下所示:

# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 22 17:49 /bin/sh -> dash

要使用bash运行命令,请将RUN指令更改为

RUN cd ~/catkin_ws/src && \
  /opt/ros/kinetic/bin/catkin_init_workspace && \
  cd ~/catkin_ws && \
  /bin/bash -c "source /home/ubuntu/.bashrc; catkin_make"

另一种选择是设置BASH_ENV环境变量,该变量应在运行bash脚本/home/ubuntu/.bashrc之前,如here所述,先指定指定的文件(catkin_make)。

ENV BASH_ENV /home/ubuntu/.bashrc
RUN cd ~/catkin_ws/src && \
  /opt/ros/kinetic/bin/catkin_init_workspace && \
  cd ~/catkin_ws && \
  /bin/bash -c "catkin_make"