docker run<;图像>&书信电报;多命令>;
我正在尝试运行多个这样的命令docker run<;图像>&书信电报;多命令>;,docker,docker-image,Docker,Docker Image,我正在尝试运行多个这样的命令 docker run image cd /path/to/somewhere && python a.py 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" 但这给了我“没有这样的文件或目录”的错误,因为它被解释为
docker run image cd /path/to/somewhere && python a.py
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"
但这给了我“没有这样的文件或目录”的错误,因为它被解释为
"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中运行多个命令,请使用
/bin/bash-c
和分号代码>
docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"
docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
如果我们需要command2(python),当且仅当command1(cd)返回零(无错误)退出状态时才会执行,请使用&&
而不是代码>
docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"
docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
您可以通过以下两种方式完成此操作:
使用-w选项更改工作目录:
-w、 --workdir=“”容器内的工作目录
将整个参数传递给/bin/bash:
docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
您还可以在Docker容器中使用管道命令,bash-c“|”
例如:
docker run img /bin/bash -c "ls -1 | wc -l"
但是,如果不在远程调用shell,输出将重定向到本地终端。如果要将结果存储在容器外部的一个文件中,则可以在本地计算机中执行类似操作
docker run image cd /path/to/somewhere && python a.py
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"
您的命令结果将在本地计算机中的/tmp/result.txt
中提供。对于任何想使用docker compose执行相同操作的人,您只需预先编写bash-c
,并将多个命令括在引号中,并与&
连接在一起
因此,在OPs示例中,docker compose运行image bash-c“cd/path/to/where&&python a.py”
只是为了从@Eddy Hernandez的评论中做出正确的回答,这是非常正确的,因为Alpine附带了ash而不是bash
现在的问题是指使用sh
或ash
或/bin/sh
或/bin/ash/
根据OP的问题:
docker run image sh-c“cd/path/to/somewhere&&python a.py”
bash-c
如果您运行的命令相对简单,则运行良好。但是,如果您试图运行一长串充满控制字符的命令,它可能会变得复杂
我通过从外部将我的命令管道化到流程中,成功地解决了这个问题
cat script.sh | docker run-i/bin/bash
谢谢您的提示!我只是简单地尝试了[docker run image“cd/bin;ls”]并得到了以下错误消息。[exec:“cd/bin;ls”:stat cd/bin;ls:没有这样的文件或目录][守护进程的错误响应:无法启动容器]任何人找到这个答案都可能对如何使用此处文档将命令馈送到容器感兴趣:。docker run alpine sh-c“ls | wc>>xxx”
这对我帮助很大,当bash不可用时。这适用于cd
,但不适用于返回代码重要的东西
与&&
不同,请参见所提供的链接中的感谢@NickZalutskiy,更新答案并附上您的评论。未提及--workdir
。页面可能已移动/更改。可以更新为,或者这个对我有用,但docker进程在命令执行后退出,我如何退出这样的docker进程?按ctrl C或ctrl Z或键入exit不起作用,或者我必须通过docker stop命令终止它吗?docker compose down[服务名称]
不起作用还是无效?(不用担心,很乐意帮助:))注意,对于这个特殊用途,docker run
有一个-w/--workdir
参数<代码>docker运行-w/path/to/where image python a.py