如何从Docker容器重定向命令输出

伊卡卡塔

关于此问题,这只是另一个话题,但是将docker容器命令STDOUT / ERR输出到文件的最佳方法是什么,而不是运行诸如

bash -c "node cluster.js >> /var/log/cluster/console.log 2>&1"

我不喜欢上面的事实,它导致了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个额外的过程时:

    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 -cstarts 1进程从另一方面分支了主节点进程。在docker容器中,command始终PID启动的进程为PID = 1,这就是我想要的节点进程。但是它将是5、6等。

伊卡卡塔

谢谢回复。我设法通过创建一个bash文件来解决该问题,该文件以以下方式启动我的节点集群exec

# 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将用节点进程替换外壳程序,这样,它始终具有PID = 1,并且我的日志将输出到文件中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章