复制文件后Docker权限问题

我有以下的docker文件

FROM ubuntu:14.04 #Install Node RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install nodejs -y RUN apt-get install nodejs-legacy -y RUN apt-get install npm -y RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # COPY distribution COPY dist dist COPY package.json package.json # Substitute dependencies from environment variables COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] EXPOSE 8000 

这里是入口点脚本

 #!/bin/sh cp package.json /usr/src/app/dist/ cd /usr/src/app/dist/ echo "starting server" exec npm start 

当我运行图像失败,这个错误

 sh: 1: http-server: not found npm ERR! weird error 127 npm WARN This failure might be due to the use of legacy binary "node" npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian 

我尝试了各种安装,但仍然得到相同的错误,我也试着检查,如果node_modules conatins http服务器可执行文件,它会。 我试图强制所有的文件777权限,但仍然遇到相同的错误

可能是什么问题呢?

它看起来像只是缺less一个npm install调用,所以node_modules目录,或其任何内容(如http-server )都出现在图像上。 在COPY package.json package.json ,如果添加了RUN npm install行,那可能就是您所需要的。

还有一些其他的东西可能会更简单,就像你可能不需要ENTRYPOINT脚本来运行应用程序并复制package.json因为已经完成了。 这里是我一直在运行的Node Docker镜像的简化版本。 我正在使用基础节点映像 ,我相信这是基于Linux的,但是如果你愿意的话,你可以保留Ubuntu的东西,这不应该成为一个问题。

 FROM node:6.9.5 # Create non-root user to run app with RUN useradd --user-group --create-home --shell /bin/bash my-app # Set working directory WORKDIR /home/my-app COPY package.json ./ # Change user so that everything that's npm-installed belongs to it USER my-app # Install dependencies RUN npm install --no-optional && npm cache clean # Switch to root and copy over the rest of our code # This is here, after the npm install, so that code changes don't trigger an un-caching # of the npm install line USER root COPY .eslintrc index.js ./ COPY app ./app RUN chown -R my-app:my-app /home/my-app USER my-app CMD [ "npm", "start" ] 

build立一个拥有/运行你的代码而不使用root的特定用户是一个很好的习惯,但是据我所知,你需要使用root来把文件放到你的映像上,因此在这里交换用户几次(这就是USER ... )。

我还会注意到,我将这个图像与Docker Compose一起用于本地开发,这就是关于代码更改的评论所指的。