复制文件后Docker权限问题

时间:2017-03-16 17:52:33

标签: node.js ubuntu docker file-permissions

我有以下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是否包含http-server可执行文件,并且确实如此。我试图强制所有文件获得777权限,但仍然遇到同样的错误

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

看起来你只是错过了npm install某个地方的呼叫,因此node_modules目录或其任何内容(如http-server)都出现在图像上。在COPY package.json package.json之后,如果添加RUN npm install行,则可能就是您所需要的。

还有一些其他的东西可能更简单,就像你可能不需要ENTRYPOINT脚本来运行应用程序并复制package.json,因为已经完成了。这是我一直在运行的Node Docker映像的简化版本。我使用的是base Node images,我相信它是基于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" ]

最好让特定用户拥有/运行代码而不使用root,但是,据我所知,你需要使用root将文件放到你的图像上,因此切换用户几次(这是USER ...的作用。

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