【问题标题】:Deploying NodeRED Docker image to Heroku fails, but local build is error free将 NodeRED Docker 映像部署到 Heroku 失败,但本地构建没有错误
【发布时间】:2021-05-24 05:59:34
【问题描述】:

我们正在尝试将基于 NodeRED 的 Docker 镜像推送到 Heroku。本地构建和测试运行起来就像一个魅力,但是当我们将它部署到 Heroku 时,Docker 镜像构建失败。我们的 docker 文件非常简单:

FROM nodered/node-red
USER node-red

# Copy package.json to the WORKDIR so npm builds all
COPY package.json .
RUN mkdir -p node-red-static
COPY node-red-static/ node-red-static/
COPY defaults .
# NodeRED configuration
COPY .node-red/settings.js /usr/src/node-red/.node-red/settings.js
COPY .node-red/flows.json /data/flows.json
COPY package.json /usr/src/node-red/package.json
# Actual installation
RUN npm install --unsafe-perm --no-update-notifier --no-fund --only=production

(我也试过不设置用户)

heroku.yml:

build:
  docker:
    web: Dockerfile

git push heroku master 上的错误:

npm WARN saveError EACCES: permission denied, open '/usr/src/node-red/package.json'
remote: npm WARN saveError EACCES: permission denied, open '/usr/src/node-red/package.json'
remote: npm WARN Error: EACCES: permission denied, open '/usr/src/node-red/package.json'
remote: npm WARN  { [Error: EACCES: permission denied, open '/usr/src/node-red/package.json']
remote: npm WARN   stack:
remote: npm WARN    'Error: EACCES: permission denied, open \'/usr/src/node-red/package.json\'',
remote: npm WARN   errno: -13,
remote: npm WARN   code: 'EACCES',
remote: npm WARN   syscall: 'open',
remote: npm WARN   path: '/usr/src/node-red/package.json' }
remote: npm WARN node-red No description
remote: npm WARN node-red No repository field.
remote: npm WARN node-red No README data
remote: npm WARN node-red No license field.
remote: 
remote: audited 627 packages in 2.146s

我错过了什么?

更新

package.json

{
  "name": "insect-core",
  "version": "0.1.0",
  "engines": {
    "node": "16.1.0",
    "npm": "7.9.0"
  },
  "main": "index.js",
  "scripts": {
    "serve": "node-red --settings ./.node-red/settings-development.js --userDir ./.node-red",
    "start": "node-red --settings ./.node-red/settings.js --userDir /data",
    "debug": "node-red --inspector --settings ./.node-red/settings.js --userDir ./.node-red",
    "test": "echo \"Error: no test specified\" && exit 1"
  }
  "author": "techdev@protenga.com",
  "license": "Apache-2.0",
  "dependencies": {
    "node-red": "^1.3.5",
    "node-red-configurable-ping": "^1.0.1",
    "node-red-contrib-auth": "^0.1.7",
    "node-red-contrib-cloudantplus": "^0.3.0",
    "node-red-contrib-dashboard-bar-chart-data": "^0.9.7",
    "node-red-contrib-dnsquery": "^1.0.6",
    "node-red-contrib-env": "^1.0.2",
    "node-red-contrib-fast-csv": "^0.4.0",
    "node-red-contrib-google": "^0.2.0",
    "node-red-contrib-google-sheets": "^0.1.0",
    "node-red-contrib-jwt": "^0.1.0",
    "node-red-contrib-loop-processing": "^0.5.1",
    "node-red-contrib-md5": "^1.0.4",
    "node-red-contrib-moment": "^4.0.0",
    "node-red-contrib-objectcleaner": "0.0.3",
    "node-red-contrib-redis": "^1.3.9",
    "node-red-contrib-simple-message-queue": "^0.2.7",
    "node-red-contrib-simple-sendmail": "^0.1.9",
    "node-red-contrib-socketio": "^1.0.7",
    "node-red-contrib-uuid": "0.0.4",
    "node-red-node-rbe": "^0.5.0",
    "node-red-node-tail": "^0.3.1"
  }
}

澄清一下:

什么失败了:

heroku stack:set container
git push heroku master

尝试在heroku上构建容器

什么有效:

heroku container:login
heroku container:push web --app insectos
heroku container:release web --app insectos

【问题讨论】:

  • 您要复制到/usr/src/node-red 目录的package.json 中有什么内容?你不应该真的改变这个文件。所有的定制都应该在/data 中。同样settings.js 也应该放在/data
  • package.json 包含我们使用的定制节点列表。删除了我们不使用的那些。添加了我们使用的那些。这是一个运行时部署
  • 编辑问题以显示该文件,但这是要更改的错误文件,它应该是/data中的那个
  • 好的,我看到你已经完全改变了/usr/src/node-red/package.json 中的默认scripts 部分。考虑到更改的数量,可能不再值得使用官方节点红色图像作为基础,因为您基本上忽略了它设置的所有内容。
  • 我会把东西改回来,而不是重新发明轮子。感谢您的帮助!

标签: docker heroku node-red


【解决方案1】:

首先,将settings.js 复制到/usr/app/node-red/.node-red 不会执行任何操作,因为它会被忽略。 Node-RED Docker 容器的usrDir/data,因此需要将settings.js 复制到那里。

其次,要安装额外的节点,请将它们添加到 package.json 中的 /data 而不是 /usr/src/node-red。然后在/data目录下运行npm install ...,这会将节点安装到/data/node_modules中。

如果您想删除任何核心节点,则需要将它们的文件名包含在 settings.js 中的 nodesExcludes 键中,如下所示:

...
nodesExcludes: [ '90-exec.js', '10-file.js'],
...

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多