我试图像这样运行MULTIPLE命令。
docker run image cd /path/to/somewhere && python a.py
但是这给了我"没有这样的文件或目录"错误,因为它被解释为......
"docker run image cd /path/to/somewhere" && "python a.py"
似乎某些ESCAPE字符如""或者()需要。
所以我也试过
docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)
但这些都没有用。
我搜索了Docker Run Reference,但没有找到有关ESCAPE字符的任何提示。
答案 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)
您可以通过以下几种方式执行此操作:
使用-w选项更改工作目录:
-w, - workdir =“”容器内的工作目录
https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w
将整个参数传递给/ 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,这意味着使用sh
或ash
或/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()
,要么让它在您在其环境或类似环境中配置的目录中查找其数据文件。