docker run <img/> <multiple commands =“”> </multiple>

时间:2015-02-13 01:04:04

标签: docker docker-image

我试图像这样运行MULTIPLE命令。

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

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

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

似乎某些ESCAPE字符如&#34;&#34;或者()需要。

所以我也试过

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

但这些都没有用。

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

8 个答案:

答案 0 :(得分:331)

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

docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"

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

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

答案 1 :(得分:24)

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

  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"
    

答案 2 :(得分:6)

您也可以在Docker容器bash -c "<command1> | <command2>"中管道命令,例如:

docker run img /bin/bash -c "ls -1 | wc -l"

但是,如果不在远程调用shell,输出将被重定向到本地终端。

答案 3 :(得分:2)

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

问题现在指向Starting a shell in the Docker Alpine container,这意味着使用shash/bin/sh/bin/ash/

基于OP的问题:

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

答案 4 :(得分:2)

如果您正在运行的命令相对简单,则

bash -c会很好地工作。但是,如果您尝试运行一系列包含控制字符的命令,则可能会变得很复杂。

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

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

答案 5 :(得分:1)

如果要将结果存储在容器外部的一个文件中,请在本地计算机中执行以下操作。

<header>
  <div class="Navbar">
    <div class="Navbar__Link Navbar__Link-brand">
      Dronezone
    </div>
    <div class="Navbar__Link Navbar__Link-toggle">
      <i class="fas fa-bars"></i>
    </div>
    <nav class="Navbar__Items Navbar__Items--right">
      <div class="Navbar__Link">
        Home
      </div>
      <div class="Navbar__Link">
        About
      </div>
      <div class="Navbar__Link">
        Pricing
      </div>
      <div class="Navbar__Link">
        Our drones
      </div>
      <div class="Navbar__Link">
        Our Realization
      </div>
      <div class="Navbar__Link">
        Contact
      </div>


    </nav>
  </div>
</header>

命令的结果将在本地计算机上的RES_FILE=$(readlink -f /tmp/result.txt) docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt" 中显示。

答案 6 :(得分:1)

对于来这里寻求与if ($startDate->format('w') == 2) {}做同样事情的任何其他人,您只需要在docker-compose前面加上多个引号并与bash -c一起括起来即可。

因此在OPs示例&&

答案 7 :(得分:0)

如果不是很明显,如果 a.py 总是需要在特定目录中运行,请创建一个简单的包装脚本来执行 cd 然后运行该脚本。

在您的 Dockerfile 中,替换

CMD [ 'python', 'a.py' ]

或任何与

CMD [ '/wrapper' ]

并在您的根目录(或您方便的任何地方)中创建一个脚本 wrapper,其内容类似于

#!/bin/sh
set -e
cd /path/to/somewhere
python a.py

在许多情况下,也许还可以考虑重写 a.py 以便它不需要包装器。要么让它在需要的位置os.chdir(),要么让它在您在其环境或类似环境中配置的目录中查找其数据文件。