在Docker中以非root用户身份运行节点应用程序
几天之后,我一直在尝试使用docker-compose
作为Docker容器内的非root用户运行节点应用程序。 无论我尝试什么,我都会得到相同的EACCES: permission denied
错误,更具体地说,它似乎是启动脚本的一个问题:
Error: EACCES: permission denied, open '/home/dev/learn-node/public/dist/App.bundle.js' npm info lifecycle dang-thats-delicious@0.0.0~assets: Failed to exec assets script
当我简单地注释掉Dockerfile中的USER dev
行并保持为root
时,我没有看到任何这些问题。 我已经尝试了许多不同的命令在我的Dockerfile中,但切换到dev
用户似乎导致的问题。
这就是我的package.json
脚本部分的样子
"scripts": { "prod": "node ./start.js", "watch": "nodemon ./start.js --ignore public/", "start": "concurrently \"npm run watch\" \"npm run assets\" --names \"💻,📦\" --prefix name", "assets": "webpack -w --display-max-modules 0", "sample": "node ./data/load-sample-data.js", "blowitallaway": "node ./data/load-sample-data.js --delete", "now": "now -e DB_USER=@db_user -e DB_PASS=@db_pass -e NODE_ENV=\"production\" -e PORT=80" },
我认为我没有理解关于权限的一些基本原则的首要问题。 为了安全,我想成为非root
。 请指教。
Dockerfile:
FROM node RUN apt-get update && apt-get -y install curl \ apt-utils \ locales \ nano \ python && \ useradd --user-group --create-home --shell /bin/false dev && \ sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ locale-gen # Set the locale # RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ # locale-gen ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 ENV HOME=/home/dev WORKDIR $HOME/learn-node COPY package.json $HOME/learn-node/ RUN chown -R dev:dev $HOME//* # npm has read write issues when switching to dev user RUN npm install RUN chown -R dev:dev /home/dev/.config USER dev CMD ["npm", "start"]