Docker exec启动脚本文件中有nohup导致操作无效

本文总结了使用 DockerExec 过程中遇到的常见问题及其解决方案,包括脚本执行环境、nohup 使用技巧、多脚本顺序执行及 DockerExec 参数配置等,帮助读者更好地理解和掌握 DockerExec 的正确使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写docker exec的时候遇到了个大坑
进入docker操作的命令可以随便执行,但是在docker exec里写就没有任何反应
我的问题出在自己的脚本文件
问题一:
自己写的脚本开头

#!/bin/sh

改为

#!/bin/bash

问题二:
nohup出了问题,nohup默认输出为nohup.out,但是使用docker exec 在外面就不自己生成,必须自己指定一个

nohup Jiaoben >my.out 2>&1 &

问题三:
执行多个前后依赖的脚本
命令虽然跑了,但是并没有跑完,所以需要等一下

sleep 10s

问题四:
docker exec指令写的不对

docker exec -it containername bash

问题出在参数 -it
可以使用以下命令查看用法

docker exec -h

所以需要使用
-d参数,后台执行

还有很多坑,自己完整写了Dockerfile,Docker-compose,启动脚本等,有时间分享,有问题可以直接留言~

<think>我们有一个多行命令,需要合并成一条可执行命令。用户给出的命令是: Qwen_id=`docker ps -a | grep 310p | awk '{print $1}'`; docker exec -it $Qwen_id -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &' 但是,这个命令有两个部分,用分号连接。第一部分是获取容器ID,第二部分是使用`docker exec`在容器内执行命令。 然而,我们注意到在`docker exec`命令中,用户使用了`-it`选项(交互式终端)和`-c`选项。但是,在`docker exec`的官方用法中,并没有`-c`选项。通常,`docker exec`的命令部分直接写在后面,不需要`-c`。所以这里可能是用户的笔误。 另外,用户希望将命令合并成一行,我们可以通过使用管道或者将命令嵌套在一起来实现。 但是,请注意:第一部分命令`docker ps -a | grep 310p | awk '{print $1}'`可能会返回多个容器ID(如果有多个匹配的话),这可能会导致问题。不过,用户可能已经确保只有一个匹配的容器。 我们可以将两个命令合并成一行,使用命令替换,将第一个命令的结果作为变量传递给第二个命令。但是,用户已经使用了分号,并且用变量存储了容器ID。所以,我们可以直接写成一行,但需要确保变量`Qwen_id`被正确设置和执行。 然而,如果我们要在一条命令中完成,而不使用中间变量,我们可以使用以下方式: ```bash docker exec -it $(docker ps -a | grep 310p | awk '{print $1}') sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &' ``` 这里,我们使用`$(command)`来获取第一个命令的输出(即容器ID),然后传递给`docker exec`命令。注意,我们移除了用户命令中的`-c`,因为`docker exec`没有这个选项,而是直接将命令放在后面。但是,我们这里使用了`sh -c`来执行一个shell命令字符串,这样就可以执行多个命令(cd和nohup)。 另外,注意`docker exec`命令需要指定在容器内执行的命令,我们使用`sh -c`来执行用户给出的命令字符串。 但是,用户命令中有一个`&`(后台运行),在非交互式shell中,这可能会导致问题。不过,由于我们使用了`-it`(交互式终端),所以可能没问题。但是,如果我们希望命令在后台运行,可能需要考虑终端的问题。 另外,由于`nohup`会忽略挂断信号,并且将输出重定向到nohup.out,所以即使我们退出了终端,命令也会继续运行。 但是,我们也要注意,`docker exec`命令本身会启动一个附加的进程在容器中运行,如果我们在后台运行这个进程(使用`&`),那么`docker exec`命令会立即返回,而不会等待命令执行完成。这可能是用户想要的。 所以,我们合并后的命令是: ```bash docker exec -it $(docker ps -a | grep 310p | awk '{print $1}') sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &' ``` 但是,这个命令有一个问题:如果`docker ps`返回了多个容器ID,那么`$(...)`会变成多个单词,导致`docker exec`命令失败。所以,我们最好确保只匹配一个容器。我们可以通过`grep`的精确匹配或者使用`docker ps`的过滤选项来优化,但用户原命令已经这样写了,所以我们先保持原样。 另外,用户命令中`grep 310p`,我们假设这个字符串是唯一的。 如果用户希望避免中间变量,并且在一行中完成,那么上述命令就是答案。 但是,用户要求的是“一条可执行命令”,所以我们给出上述命令即可。 注意:在合并命令时,我们使用了`sh -c`来执行用户原来的命令字符串,这样我们就可以在容器内执行多个命令(cd和nohup)。 另外,我们移除了用户原来的`-c`选项,因为`docker exec`没有这个选项,而是通过`sh -c`来传递命令。 最后,我们检查一下命令的可行性: 1. 获取容器ID:`docker ps -a | grep 310p | awk '{print $1}'`,返回容器ID。 2. 执行:`docker exec -it [容器ID] sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &'`。 这样,命令就可以在容器内切换到指定目录,并在后台运行脚本。 但是,我们也要注意,如果容器内没有`sh`(比如使用alpine镜像,默认是`sh`,但有些镜像可能没有),那么我们需要使用`bash`或者其他shell。不过,用户原来的命令是直接使用`-c`,但那是错误的,我们这里修正为`sh -c`,因为`sh`是标准shell,大多数容器都有。 如果用户容器内没有`sh`,那么需要根据容器实际情况调整。但根据用户命令,我们假设容器有`sh`。 所以,最终合并的命令就是上面那一条。 但是,用户原来的命令中,在`docker exec`后面直接是`-c`,这可能是用户将`docker run`的选项混淆了。在`docker run`中,`-c`是用于分配CPU份额的,而执行命令是直接写在后面。而`docker exec`是直接写命令,不需要`-c`。所以我们修正为使用`sh -c`来执行字符串命令。 因此,我们给出合并后的命令:</think>要将给定的多行 Shell 命令合并为一条可执行命令,用于通过 Docker 启动 Qwen 服务,可以使用命令替换 `$(...)` 将容器 ID 获取和命令执行合并为单行: ```bash docker exec -it $(docker ps -a | grep 310p | awk '{print $1}') sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &' ``` ### 命令解析: 1. **`$(docker ps -a | grep 310p | awk '{print $1}')`** 动态获取容器 ID: - `docker ps -a`:列出所有容器 - `grep 310p`:筛选名称/ID 包含 `310p` 的容器 - `awk '{print $1}'`:提取容器 ID 2. **`sh -c 'cd ... && nohup ... &'`** 在容器内执行命令: - `cd /workspace/qwen2.5-7b-test`:切换到工作目录 - `nohup ./run_server_mindie.sh &`:后台启动服务(`nohup` 防止进程退出) ### 注意事项: 1. **容器唯一性** 确保 `grep 310p` 只匹配一个容器,否则会因多个 ID 导致命令失败。建议使用容器名称替代模糊匹配: ```bash docker exec -it qwen_container sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh &' ``` 2. **后台运行** `&` 使服务在后台运行,但需注意: - 退出容器后进程仍存在(因 `nohup`) - 日志默认输出到 `nohup.out`,建议重定向(如 `nohup ./run_server_mindie.sh > log.txt 2>&1 &`) 3. **权限问题** 若容器无写入权限,需在运行容器时挂载卷: ```bash docker run -v /host/path:/workspace/qwen2.5-7b-test ... [^1] ``` ### 优化建议: ```bash # 使用容器名称 + 日志重定向 docker exec -it qwen_container sh -c 'cd /workspace/qwen2.5-7b-test && nohup ./run_server_mindie.sh > server.log 2>&1 &' ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值