在Docker中更改目录命令?

在docker中,我想这样做:

git clone XYZ
cd XYZ
make XYZ

然而,因为没有cd命令,我每次都必须传入完整路径(使XYZ /fullpath)。对此有什么好的解决方案吗?

433850 次浏览

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

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \
rm -f treeio.zip && cd treeio && pip install -r requirements.pip

由于使用了'&&',因此只有在前面所有命令都成功执行的情况下,才会执行最后的'pip install'命令。

事实上,因为每次RUN都会创建一个新的commit &(目前)AUFS层,如果你有太多的命令在Dockerfile中,你会用完限制,所以合并运行(当文件是稳定的)可以是一个非常有用的事情。

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

RUN git clone XYZ
WORKDIR "/XYZ"
RUN make

我想知道如果两次WORKDIR将工作与否,但它工作了:)

FROM ubuntu:18.04


RUN apt-get update && \
apt-get install -y python3.6


WORKDIR /usr/src


COPY ./ ./


WORKDIR /usr/src/src


CMD ["python3", "app.py"]

注意,如果你必须在bash shell中运行,你不仅需要RUN make,还需要在此之前调用bash shell,因为在Docker中,默认情况下你是在sh shell中。

取自/bin/sh: 1: gvm: not found .输出说明,它表示或多或少:

你的shell是/bin/sh,但是源代码期望/bin/bash,可能是因为它 将其初始化放在~/.bashrc

换句话说,这个问题可能发生在任何设置中,其中"shell被用来代替"bash",导致"/bin/sh: 1: MY_COMMAND: not found". shell。

对于Dockerfile,请使用推荐配置

RUN /bin/bash -c 'source /opt/ros/melodic/setup.bash'

或带有"[]"(我宁愿不用):

RUN ["/bin/bash", "-c", "source /opt/ros/melodic/setup.bash"]

bash的每个新RUN都是隔离的,“从0开始”。例如,请注意在Dockerfile中的bash命令之前设置WORKDIR /MY_PROJECT并不会影响bash命令,因为开始文件夹必须设置在" bashrc"一次。即使你设置了WORKDIR,它也需要cd /MY_PROJECT

旁注:不要忘记第一个"/"在“选择/ . . /……“。否则,它将抛出错误:

/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/sh: 1: MY_COMMAND: not found " 在超级用户的一些细节,这看起来与许多行,或你将如何填充"代替。但这有点超出了实际的问题。

PS:你也可以把你想要执行的命令放在一个bash脚本中,然后在Dockerfile中运行这个bash脚本(尽管我宁愿把bash命令也放在Dockerfile中,这只是我的观点):

#!/bin/bash
set -e


source /opt/ros/melodic/setup.bash

您可以对所有这些使用一个RUN命令

RUN git clone XYZ && \
cd XYZ && \
make XYZ

如果你想在运行docker映像时改变容器的工作目录,你可以使用-w (--workdir的缩写)选项:

docker run -it -w /some/valid/directory/inside/docker {image-name}

裁判:

docker run选项:https://docs.docker.com/engine/reference/commandline/run/#options