如何重定向docker容器的命令输出

时间:2018-04-20 12:50:13

标签: docker logging docker-compose output stdout

关于此问题的另一个主题,但是将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等等。

1 个答案:

答案 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,我的日志输出到文件。