在docker中,我想这样做:
git clone XYZ
cd XYZ
make XYZ
然而,因为没有cd命令,我每次都必须传入完整路径(使XYZ /fullpath)。对此有什么好的解决方案吗?
在docker中,我想这样做:
git clone XYZ
cd XYZ
make XYZ
然而,因为没有cd命令,我每次都必须传入完整路径(使XYZ /fullpath)。对此有什么好的解决方案吗?
当前回答
注意,如果你必须在bash shell中运行,你不仅需要run make,还需要在之前调用bash shell,因为在Docker中,你默认是在sh shell中运行。
从/bin/sh: 1: gvm: not found,这将表示或多或少:
您的shell是/bin/sh,但源代码期望/bin/bash,可能是因为它 将其初始化放在~/.bashrc中。
换句话说,在任何使用“sh”shell而不是“bash”的设置中都可能出现这个问题,导致“/bin/sh: 1: MY_COMMAND: not found”。
对于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。
附注:不要忘记“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] [...]
查看“/bin/sh: 1: MY_COMMAND: not found”在SuperUser的更多细节,这看起来有很多行,或者你将如何填充“。bashrc”。(但这有点超出了实际的问题。
PS:你也可以把你想要执行的命令放在一个bash脚本中,然后在Dockerfile中运行这个bash脚本(尽管我宁愿把bash命令也放在Dockerfile中,这只是我的观点):
#!/bin/bash
set -e
source /opt/ros/melodic/setup.bash
其他回答
您可以运行一个脚本,或一个更复杂的参数到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中有太多的命令,你会用完限制,所以合并RUN(当文件稳定时)是一件非常有用的事情。
注意,如果你必须在bash shell中运行,你不仅需要run make,还需要在之前调用bash shell,因为在Docker中,你默认是在sh shell中运行。
从/bin/sh: 1: gvm: not found,这将表示或多或少:
您的shell是/bin/sh,但源代码期望/bin/bash,可能是因为它 将其初始化放在~/.bashrc中。
换句话说,在任何使用“sh”shell而不是“bash”的设置中都可能出现这个问题,导致“/bin/sh: 1: MY_COMMAND: not found”。
对于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。
附注:不要忘记“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] [...]
查看“/bin/sh: 1: MY_COMMAND: not found”在SuperUser的更多细节,这看起来有很多行,或者你将如何填充“。bashrc”。(但这有点超出了实际的问题。
PS:你也可以把你想要执行的命令放在一个bash脚本中,然后在Dockerfile中运行这个bash脚本(尽管我宁愿把bash命令也放在Dockerfile中,这只是我的观点):
#!/bin/bash
set -e
source /opt/ros/melodic/setup.bash
要更改到另一个目录,请使用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"]
如果你想在运行docker镜像时改变容器的工作目录,你可以使用-w(——workdir的缩写)选项:
docker run -it -w /some/valid/directory/inside/docker {image-name}
Ref:
Docker运行选项:https://docs.docker.com/engine/reference/commandline/run/#options