Dockerfile创建一个文件,然后将其';它不在那里

Dockerfile创建一个文件,然后将其';它不在那里,docker,Docker,这只是一个文件的一部分,让我很困惑。顺便说一下,它还有一些额外的调试行。在第一行中,我创建了/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/.ba

这只是一个文件的一部分,让我很困惑。顺便说一下,它还有一些额外的调试行。在第一行中,我创建了/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

当然,这是我的错误,但我看不到它,也看不到我理解上的差距。谢谢

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

它并不是告诉您文件
/home/ubuntu/.bashrc
,而是
源代码
不是命令

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

不要忘记为脚本授予exec权限:

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


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

它并不是告诉您文件
/home/ubuntu/.bashrc
,而是
源代码
不是命令

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

不要忘记为脚本授予exec权限:

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


正如@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脚本
catkin_make
之前,该变量应该源于指定的文件(
/home/ubuntu/.bashrc


正如@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脚本
catkin_make
之前,该变量应该源于指定的文件(
/home/ubuntu/.bashrc


@皮托萨拉斯。我编辑了你问题的答案。请等迈克尔批准。这引出了另一件让我困惑的事:那份拷贝到底是从哪里来的?我假设它正在复制到容器的根目录。@pitosalas,从\u source\u文件夹复制到\u container\u文件夹,这样就可以将与Dockerfile位于同一目录中的script.sh文件复制到容器的根文件夹(/)。但是您可以更改这两个参数,例如:COPY src/script.sh/usr/local/bin/,将此副本从src文件夹复制到usr/local/bin@pitosalas. 我编辑了你问题的答案。请等迈克尔批准。这引出了另一件让我困惑的事:那份拷贝到底是从哪里来的?我假设它正在复制到容器的根目录。@pitosalas,从\u source\u文件夹复制到\u container\u文件夹,这样就可以将与Dockerfile位于同一目录中的script.sh文件复制到容器的根文件夹(/)。但是您可以更改这两个参数,比如:COPY src/script.sh/usr/local/bin/,这个从src文件夹复制到usr/local/bin的副本应该会有帮助-应该会有帮助-哇!我假设我没有编写shell脚本,它是为bash编写的,所以dash不能运行它?或者有没有一种方法可以直接使用dash?(2) 另外,当您说“另一个选项”时,您的意思是我可以在您的示例运行catkin make的地方添加一个-I,使用正确的-c?尝试您的建议,这意味着什么:步骤17/30:运行cd~/catkin_ws/src&/bin/bash-c-I“catkin_init_workspace”-->在e16b435a0439 bash中运行:无法设置终端进程组(1):设备bash的ioctl不合适:此shell bash中没有作业控制:/home/ubuntu/catkin_ws/devel/setup.bash:没有此类文件或directory@pitosalas对如果脚本是为bash创建的,那么如果脚本使用特定的bash功能,则很可能与dash不兼容。我猜bash无法在Dockerfile指令中以交互方式运行(bash带有
-I
)。我已将其从答案中删除,并添加了另一个备选选项。希望这有帮助!出于某种原因,脚本作者在其中设置了ifs,用于检查脚本是否以交互方式运行,如果不是,则跳过重要步骤。我不知道他们为什么这么做,但是,有没有办法让别人写的脚本认为它是以交互方式运行的呢?哇!我假设我没有编写shell脚本,它是为bash编写的,所以dash不能运行它?或者有没有一种方法可以直接使用dash?(2) 另外,当您说“另一个选项”时,您的意思是我可以在您的示例运行catkin make的地方添加一个-I,使用正确的-c?尝试您的建议,这意味着什么:步骤17/30:运行cd~/catkin_ws/src&/bin/bash-c-I“catkin_init_workspace”-->在e16b435a0439 bash中运行:无法设置终端进程组(1):设备bash的ioctl不合适:此shell bash中没有作业控制:/home/ubuntu/catkin_ws/devel/setup.bash:没有此类文件或directory@pitosalas对如果脚本是为bash创建的,那么如果脚本使用特定的bash功能,则很可能与dash不兼容。我猜bash无法在Dockerfile指令中以交互方式运行(bash带有
-I
)。我已将其从答案中删除,并添加了另一个备选选项。希望这有帮助!出于某种原因,脚本作者在其中设置了ifs,用于检查脚本是否以交互方式运行,如果不是,则跳过重要步骤。我不知道他们为什么这么做,但是,有没有办法让别人编写的脚本认为它是以交互方式运行的?