我正在运行一个只包含Bash脚本的Ubuntu Docker容器。我想使用docker exec在该容器内启动我的应用程序,如下所示:
docker exec -it 0b3fc9dd35f2 ./main.sh
在主脚本中,我想使用nohup运行另一个长时间运行的应用程序:
#!/bin/bash
nohup ./java.sh &
#with this strange sleep the script is working
#sleep 1
echo `date` finish main >> /status.log
java.sh脚本如下所示(为了简单起见,这是一个虚拟脚本):
#!/bin/bash
sleep 10
echo `date` finish java >> /status.log
问题在于 java.sh 在 docker exec 返回后立即被杀死。问题是为什么?
我找到的唯一解决方法是,在第一个脚本中添加一些虚假的 sleep 1
,在 nohup 启动后。然后第二个进程就能正常运行了。你有什么想法吗?为什么会这样?
[编辑]
第二种解决方法是在 java.sh
脚本中,在睡眠之前添加一些 echo
或 trap
命令。然后它可以正常工作。不幸的是,我不能使用这个解决方法,因为我有一个 Java 进程,而不是这个脚本。
docker exec
来启动一个容器,而是应该使用docker run
命令,并且需要仔细查看 Dockerfile 中的CMD
和ENTRYPOINT
指令。 - user2915097