使用Meteor settings.json的主管在启动时

时间:2017-03-02 11:05:34

标签: meteor supervisord supervisor

如何通过主管将--settings json文件传递给meteor? 如果我从home命令运行meteor run命令,一切都很完美:

meteor --settings settings.json

这是我当前的conf.d文件:

[program:demo]
command=/usr/local/bin/meteor
directory=/home/username/demo
autostart=true
autorestart=true
environment=
    HOME="/home/username",
    METEOR_SETTINGS="/home/username/demo/settings.json"
stdout_logfile=/home/username/demo.log
stdout_logfiel_maxbytes=50MB
user=username

会出现以下错误:

Errors prevented isopacket load:

While loading isopacket `constraint-solver`:
packages/meteor.js:59:11: METEOR_SETTINGS are not valid JSON:
/home/username/demo/settings.json
at packages/meteor.js:59:11
at packages/meteor.js:80:4
at packages/meteor.js:1380:3

settings.json

{
  "private": {
    "init_admin": {
      "userName": "admin",
      "email": "admin@example.com",
      "password": "test123"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我很惊讶没人回答过这个问题。我试图弄清楚如何将settings.json文件放入METEOR_SETTINGS并在supervisor配置中避免语法错误时在google上找到了您的问题。

因为要回答您的问题, METEOR_SETTINGS环境变量必须包含JSON。所以它必须包含settings.json的JSON数据,而不是文件名或路径

由于您将JSON数据放入环境变量,这有点愚蠢。所以基本上METEOR_SETTINGS =“$(cat settings.json | tr -d'\ n')”但这样做会导致supervisord出现问题,因为这种语法显然不受支持。

"error: <class 'xmlrpclib.Fault'>, <Fault 92: 'CANT_REREAD: Unexpected end of key/value pairs'>: file: /usr/lib64/python2.7/xmlrpclib.py line: 794"]

我的永久解决方案是使用shell脚本包装node命令,以便我可以在bash而不是supervisord中正确设置METEOR_SETTINGS变量。

因此,请在supervisord中从您的环境中删除METEOR_SETTINGS。 (这是我的Ansible中的一个例子,这就是为什么值用括号括起来的原因)

[program:pwfrank]                                                                                                                            
directory={{pwfrank_home}}/build/bundle                                                                                                      
command={{pwfrank_home}}/start_node.sh 
environment=                                                                                                                                 
  HOME="{{pwfrank_home}}",                                                                                                                   
  MONGO_URL="{{pwfrank_mongo_url}}",                                                                                                         
  PORT="{{pwfrank_listenport}}",                                                                                                             
  ROOT_URL="{{pwfrank_baseurl}}"                                                                                                             

例如,创建一个这样的shell脚本。

#!/usr/bin/env bash

export METEOR_SETTINGS="$(cat {{pwfrank_home}}/pwfrank/{{pwfrank_settings_file}} | tr -d '\n')"                                              

/usr/local/bin/meteor node main.js    

这对我有用,但我正在从主管转移到systemd,因为systemd有环境文件,所以我不必使用shell脚本来包装节点。

编辑未来的googlers:我最终意识到只要你将json数据放在单引号之间,systemd就能正常工作。我个人用ansible完成了这个,用上面提到的cat | tr命令提取JSON数据,把它放到一个可靠的事实中,然后在我的EnvironmentFile模板中使用systemd中的Meteor服务单元中的事实。