AKS中以非root用户运行Node.js应用绑定80端口遇权限拒绝
问题:AKS中Node.js非root用户监听80端口遇权限拒绝错误
我在Azure Kubernetes Service(AKS)的Kubernetes容器中运行一个监听80端口的Node.js应用,当Dockerfile以非root用户运行时,出现以下错误:
node:events:496 throw er; // Unhandled 'error' event ^ Error: listen EACCES: permission denied 0.0.0.0:80 at listenInCluster (node:net:1945:12) at Server.listen (node:net:2037:7) at Function.listen (/data/app/node_modules/express/lib/application.js:635:24) at /data/app/app.js:67:24 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) Emitted 'error' event on Server instance at: at emitErrorNT (node:net:1924:8) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { code: 'EACCES', errno: -13, syscall: 'listen', address: '0.0.0.0', port: 80 }
我尝试通过给node可执行文件添加绑定*特权端口(<1024>)*的能力来解决问题,基于Red Hat UBI Minimal基础镜像修改了Dockerfile:
USER root RUN microdnf install sudo RUN sudo setcap cap_net_bind_service=+ep `readlink -f $(which node)` USER appUser CMD node app.js
已通过getcap命令验证setcap执行成功,但问题依旧。当前环境是企业级Kubernetes集群,不确定是否有其他限制因素。另外需要注意:Kubernetes容器规格中指定的command和args覆盖了Dockerfile的entrypoint,实际会调用一个shell脚本加载环境变量后再执行node app.js,这是否会导致权限能力失效?
内容的提问来源于stack exchange,提问作者unc0ded
相关产品推荐
相关产品推荐

