在Docker中更改目录命令?

在Docker中更改目录命令?,docker,cd,Docker,Cd,在docker中,我想这样做: git clone XYZ cd XYZ make XYZ 但是,因为没有cd命令,所以每次都必须传递完整路径(make XYZ/fullpath)。有什么好的解决方案吗?您可以运行脚本,或者运行更复杂的参数。下面是我之前下载的Dockerfile中的一个示例: RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \ rm -f tre

在docker中,我想这样做:

git clone XYZ
cd XYZ
make XYZ

但是,因为没有cd命令,所以每次都必须传递完整路径(make XYZ/fullpath)。有什么好的解决方案吗?

您可以运行脚本,或者运行更复杂的参数。下面是我之前下载的Dockerfile中的一个示例:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip
由于使用了“&&”,因此只有在前面的所有命令都成功的情况下,它才会进入最终的“pip install”命令


事实上,由于每次运行都会创建一个新的commit&(当前)AUFS层,因此如果Dockerfile中的命令太多,则会耗尽限制,因此合并运行(当文件稳定时)是一件非常有用的事情。

切换到另一个目录使用。WORKDIR之后的所有RUN、CMD和ENTRYPOINT命令都将从该目录执行

RUN git clone XYZ 
WORKDIR "/XYZ"
RUN make

我想知道两次
WORKDIR
是否有效,但它确实有效:)


请记住,如果您必须在
bash
shell中运行,您不仅需要
run make
,还需要在调用
bash
shell之前,因为在Docker中,默认情况下您在
sh
shell中。

取自,大致可以说:

您的shell是/bin/sh,但源代码需要/bin/bash,可能是因为 将其初始化置于
~/.bashrc

换句话说,在使用“sh”shell而不是“bash”的任何设置中都可能出现此问题,从而导致
“/bin/sh:1:MY_命令:找不到”

在Dockerfile的情况下,使用建议的

RUN /bin/bash -c 'source /opt/ros/melodic/setup.bash'
或者使用“
[]
”(我不想使用):

bash的每一次新运行都是孤立的,“从0开始”。例如,请注意,在Dockerfile中的bash命令之前设置
WORKDIR/MY_PROJECT
,不会影响bash命令,因为必须再次在“.bashrc”中设置起始文件夹。即使您设置了WORKDIR,它也需要cd/MY_PROJECT。

旁注:不要忘记“opt/。/…”之前的第一个“/”。否则,它将抛出错误:

/bin/bash: opt/ros/melodic/setup.bash: No such file or directory
作品:

 => [stage-2 18/21] RUN ["/bin/bash", "-c", "source /opt/ros/melodic/setup.bash"]                                  0.5s
 => [stage-2 19/21] [...]
请参阅超级用户,了解更多关于多行的外观,或者如何填充“.bashrc”的详细信息。但这超出了这里的实际问题。

PS:您还可以将要执行的命令放在一个bash脚本中,并在Dockerfile中运行该bash脚本(尽管我更愿意将bash命令也放在Dockerfile中,这只是我的意见):


相关:WORKDIR命令被认为是一种可能的解决方案,而不是一种解决方案,它是使用WORKDIR的推荐解决方案,我认为这是对问题的更合适的回答。注意,这会创建多个层(我认为?),这应该是公认的答案。我认为这个答案是不够的。在我的情况下,它对我没有帮助,它只在标准情况下有帮助,例如使用
apt get
或在
sh
shell(=Dockerfile默认值)中工作的其他命令。如果您需要
bash
而不是
sh
shell,因为Dockerfile中也需要许多bash命令,这是正常的,您需要在使用该命令之前调用
bash
shell。看见WORKDIR在隔离的
bash
-
RUN
中不起作用,如果您不更改“.bashrc”,bash将以/root开头。如果您想知道,
cd
的效果只对当前的
RUN
命令有效。下一次
运行
将从当前的
WORKDIR
开始。这对我不起作用。我得到一个错误,该目录不存在。只有
WORKDIR
有效。这不应该是解决方案。问题很简单,就是如何让CD发挥作用。@Ritchie,这正是我来这里的目的。谢谢
/bin/bash: opt/ros/melodic/setup.bash: No such file or directory
 => [stage-2 18/21] RUN ["/bin/bash", "-c", "source /opt/ros/melodic/setup.bash"]                                  0.5s
 => [stage-2 19/21] [...]
#!/bin/bash
set -e

source /opt/ros/melodic/setup.bash