我无法理解docker容器如何保持正常运行。据我所知,如果容器没有任何活动进程,它将独立于给定的命令自动关闭。
这就是我指示app.get('/log', function(req, res){
r = req.query;
var sql = mysql.format('select sum(left_num) as left_sum, sum(right_num) as right_sum from temp where nickname = ? and today_date = date(current_date());',r.nickname);
var query = connection.query(sql,function(err,result){
if (err) throw err;
if ((result[0].left_sum - result[0].right_sum >=30 )|| (result[0].right_sum - result[0].left_sum >=30 )){
console.log("Sensor is broken");
res.end("NOT OK: Sensor is broken");
}
else{
insert_temp(r.nickname,r.left_num,r.right_num);
res.end('OK:' + JSON.stringify(req.query));
}
});
});
执行此命令以使其保持活动状态的原因:
docker-compose.yml
我的 gateway:
build: .
image: me/gateway
container_name: gateway
command: tail -F /dev/null <------
# restart: always
ports:
- "10091:10091"
volumes:
- ./logs:/root/logs
- vendor:/root/vendor
- .:/root
env_file:
- .env
执行以下操作:
Dockerfile
在这种情况下,容器保持不动,一切都很好。但是,我想在容器启动后运行脚本,因此我在FROM php:7-fpm-alpine
EXPOSE 10091
WORKDIR /root
COPY . .
COPY src/scripts/generateConfig.sh /usr/local/bin/generateConfig
RUN ["chmod", "+x", "/usr/local/bin/generateConfig"]
的末尾添加了另一行:
Dockerfile
运行命令后,容器自动停止。当我检查日志时,没有错误,因为脚本按预期完成了工作。脚本负责无限期运行Ratchet Web套接字进程。
如何使脚本运行并同时保持容器运行?
答案 0 :(得分:0)
启动容器时,它将运行您在ENTRYPOINT
或CMD
中定义的命令。
该命令通常会启动一个进程,只要该进程在前台运行,容器仍将运行。
如果您的进程在后台运行,则容器将停止。
因此,如果您正在运行脚本,则需要确保它永远不会结束。
您只需在脚本末尾添加以下行即可实现这一点:
tail -f <some log file> # keep listening on your application log file.
或者,您可以在true时添加一些内容:
while true; sleep 2; done
希望会有所帮助
答案 1 :(得分:0)
我发现了问题。用于启动Web套接字进程的命令脚本中的以下行将其启动:
nohup php ${serviceProcess} >> /dev/null 2>&1 &
解决方案不是仅通过使用以下方式抑制输出:
nohup php ${serviceProcess}
现在效果很好