我们正在尝试将基于 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
答案 0 :(得分:1)
首先,将 settings.js
复制到 /usr/app/node-red/.node-red
不会有任何作用,因为它会被忽略。 Node-RED Docker 容器的 usrDir
是 /data
,因此需要将 settings.js
复制到那里。
其次,要安装额外的节点,请将它们添加到 package.json
中的 /data
而不是 /usr/src/node-red
。然后在 npm install ...
目录中运行 /data
,这会将节点安装到 /data/node_modules
中。
如果要删除任何核心节点,则需要将它们的文件名包含在 nodesExcludes
的 settings.js
键中,如下所示:
...
nodesExcludes: [ '90-exec.js', '10-file.js'],
...