docker exec 执行脚本失败解决
背景介绍
docker容器里有一个脚本,需要在使用的时候在后台运行,但是通过docker exec 调用这个脚本却一直得不到想要的结果,于是开始了探究之路!
原始脚本
docker exec -it service_name /bin/bash -c /opt/start.sh
这个start.sh的作用就是在后台启动两个服务
#!/bash nohup start1.sh > start1.log 2>&1 & sleep 5 nohup start2.sh 2>&1 & echo server started
问题定位
1. 脚本书写不规范
从上述的命令中可以看到docker 启动的时候用的式/bin/bash 而脚本中指定的确实/bash.我们都知道脚本第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。因此需要把脚本中的第一行用/bin/bash替换了,使得它们用同一个解释器
2.启动参数有问题
docker exec 执行的过程中使用了-it这个参数,
-
-t让docker分配一个伪终端并绑定到容器的标准输入上 -i则让容器的标准输入保持打开.
这样执行完后台脚本只能云行第一个start.sh, 第二个并不能起作用,因为执行完了终端也退出了,
看到help 中, 有一个-d, 后台云行脚本, 这一条刚好符合我们的要求
修改过程
docker exec -d service_name /bin/bash -c /opt/start.sh
#!/bin/bash nohup start1.sh > start1.log 2>&1 & sleep 5 nohup start2.sh 2>&1 & echo server started
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
关于缓存穿透、缓存击穿、缓存雪崩