我试图运行这样的多个命令。

docker run image cd /path/to/somewhere && python a.py

但是这给了我“没有这样的文件或目录”错误,因为它被解释为…

"docker run image cd /path/to/somewhere" && "python a.py"

似乎需要一些像“”或()这样的转义字符。

所以我也尝试了

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

但这些都没用。

我已经搜索了Docker运行参考,但没有找到任何关于转义字符的提示。


当前回答

对于其他想用docker-compose来做同样事情的人来说,你只需要在bash -c前加上引号,然后用&&把多个命令括起来。

因此,在OPs示例中,docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

其他回答

你可以通过以下几种方式做到这一点:

使用-w选项更改工作目录: -w,——workdir=""容器内的工作目录 https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w 将整个参数传递给/bin/bash: Docker运行镜像/bin/bash -c "cd /path/to/somewhere;python a.py”

TL; diana;

$ docker run --entrypoint /bin/sh image_name -c "command1 && command2 && command3"

关于已接受答案的一个问题如下。

没有人提到docker run image_name /bin/bash -c只是将一个命令附加到入口点。一些流行的图像足够智能,可以正确处理这些信息,但有些则不行。

想象一下下面的Dockerfile:

FROM alpine
ENTRYPOINT ["echo"]

如果你试着以echo的形式构建它并运行:

$ docker run echo /bin/sh -c date

您的命令将被追加到入口点,因此结果将是echo "/bin/sh -c date"。

相反,你需要重写入口点:

$ docker run --entrypoint /bin/sh echo -c date

Docker运行参考

如果您运行的命令相对简单,Bash -c工作得很好。但是,如果您试图运行一长串充满控制字符的命令,它可能会变得复杂。

我成功地绕过了这个问题,从外部将我的命令输入到进程中。

Cat script.sh | docker运行-i <image> /bin/bash

如果您想将结果存储在容器之外的一个文件中,也就是在您的本地机器上,您可以这样做。

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "grep root /etc/passwd > /result.txt"

命令的结果将在本地机器的/tmp/result.txt中可用。

如果你不介意在子shell中运行命令,只需在要运行的多个命令周围加上一组外括号:

docker run image (cd /path/to/somewhere && python a.py)