关于此问题的另一个主题,但是将docker容器命令STDOUT / ERR输出到除运行命令之外的文件的最佳方法是什么,例如
bash -c "node cluster.js >> /var/log/cluster/console.log 2>&1"
我不喜欢上面的内容是它会产生一个额外的过程,所以最后我得到2个进程而不是1个,而我的主集群进程不是PID = 1的那个。
如果我尝试
exec node cluster.js >> /var/log/cluster/console.log 2>&1
我收到此错误:
Error response from daemon: Cannot start container node:
exec: "node cluster.js >> /var/log/cluster/console.log 2>&1": executable file not found in $PATH
我通过docker-compose启动我的容器:
version: '3'
services:
node:
image: custom
build:
context: .
args:
ENVIRONMENT: production
restart: always
volumes:
- ./logs:/var/log/cluster
command: bash -c "node cluster.js >> /var/log/cluster/console.log 2>&1"
ports:
- "443:443"
- "80:80"
当我docker-compose exec node ps -fax | grep -v grep | grep node
时,我得到一个额外的过程:
1 ? Ss 0:00 bash -c node cluster.js >> /srv/app/cluster/cluster.js
5 ? Sl 0:00 node cluster.js
15 ? Sl 0:01 \_ /usr/local/bin/node /srv/app/cluster/cluster.js
20 ? Sl 0:01 \_ /usr/local/bin/node /srv/app/cluster/cluster.js
正如您所看到的,bash -c
启动了1个进程,另一方面,该进程分叉主节点进程。在docker容器中,command
启动的进程总是有PID = 1,这就是我想要的节点进程。但它将是5,6等等。
答案 0 :(得分:1)
感谢您的回复。我设法通过创建一个用exec
启动节点集群的bash文件解决了这个问题:
# start-cluster.sh
exec node cluster.js >> /var/log/cluster/console.log 2>&1
在docker-compose文件中:
# docker-compose.yml
command: bash -c "./start-cluster.sh"
使用exec
启动集群用节点进程替换shell,这样它总是PID = 1,我的日志输出到文件。