Docker容器保持正常运行

时间:2019-06-07 10:43:19

标签: docker docker-compose dockerfile docker-container

我无法理解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套接字进程。

如何使脚本运行并同时保持容器运行?

2 个答案:

答案 0 :(得分:0)

启动容器时,它将运行您在ENTRYPOINTCMD中定义的命令。 该命令通常会启动一个进程,只要该进程在前台运行,容器仍将运行。 如果您的进程在后台运行,则容器将停止。 因此,如果您正在运行脚本,则需要确保它永远不会结束。 您只需在脚本末尾添加以下行即可实现这一点:

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}

现在效果很好