docker run <IMAGE> <MULTIPLE COMMANDS>

ai0*_*307 218 docker docker-image

我正在尝试运行这样的MULTIPLE命令.

docker run image cd /path/to/somewhere && python a.py
Run Code Online (Sandbox Code Playgroud)

但这给了我"没有这样的文件或目录"错误,因为它被解释为......

"docker run image cd /path/to/somewhere" && "python a.py"
Run Code Online (Sandbox Code Playgroud)

似乎需要一些像""或()这样的ESCAPE字符.

所以我也试过了

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)
Run Code Online (Sandbox Code Playgroud)

但这些都行不通.

我搜索了Docker Run Reference但没有找到有关ESCAPE字符的任何提示.

anh*_*hlc 392

要在docker中运行多个命令,请使用/bin/bash -c和分号;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"
Run Code Online (Sandbox Code Playgroud)

如果我们需要command2(python)将被执行当且仅当command1(cd)返回零(无错误)退出状态时,使用&&而不是;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
Run Code Online (Sandbox Code Playgroud)

  • `docker run alpine sh -c"ls | wc >> xxx"`这对我很有帮助,当bash不可用时. (13认同)
  • 没有人提到“docker run image_name /bin/bash -c”只是将命令附加到入口点,而不是灵丹妙药。请检查下面我的答案/sf/answers/5253339871/。 (2认同)

Joh*_*one 27

您可以通过以下几种方式执行此操作:

  1. 使用-w选项更改工作目录:

    -w, - workdir =""容器内的工作目录

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. 将整个参数传递给/ bin/bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
    Run Code Online (Sandbox Code Playgroud)


USE*_*R_1 8

您还可以在Docker容器内通过管道传递命令,bash -c "<command1> | <command2>"例如:

docker run img /bin/bash -c "ls -1 | wc -l"
Run Code Online (Sandbox Code Playgroud)

但是,在不调用远程shell的情况下,输出将被重定向到本地终端。


Nqs*_*sir 8

只是为了从 @Eddy Hernandez 的评论中做出正确的回答,这是非常正确的,因为 Alpine 带有 ash 而不是 bash。

现在的问题是指在 Docker Alpine 容器中启动 shell,这意味着使用shor ashor /bin/shor /bin/ash/

根据OP的问题:

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


igo*_*ops 8

TL;博士;

$ docker run --entrypoint /bin/sh image_name -c "command1 && command2 && command3"
Run Code Online (Sandbox Code Playgroud)

关于已接受答案的担忧如下。

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

想象一下以下 Dockerfile:

FROM alpine
ENTRYPOINT ["echo"]
Run Code Online (Sandbox Code Playgroud)

如果您尝试将其构建为echo并运行:

$ docker run echo /bin/sh -c date
Run Code Online (Sandbox Code Playgroud)

您会将命令附加到入口点,因此结果将为echo "/bin/sh -c date".

相反,您需要覆盖入口点:

$ docker run --entrypoint /bin/sh echo -c date
Run Code Online (Sandbox Code Playgroud)

Docker 运行参考


小智 6

bash -c如果您正在运行的命令相对简单,则效果很好。但是,如果您尝试运行一长串充满控制字符的命令,它会变得很复杂。

我通过将我的命令从外部管道传输到进程中成功地解决了这个问题,即

cat script.sh | docker run -i <image> /bin/bash