Docker-尝试访问Dockerfile中创建的文件夹时权限被拒绝

时间:2019-04-05 08:29:44

标签: node.js docker ubuntu permission-denied

我的Dockerfile出现问题(下面的代码)

 FROM node:4.2.6
 MAINTAINER kamil
 RUN useradd -ms /bin/bash node
 RUN mkdir -p /home/node/app && chown -R node:node /home/node/app
 WORKDIR /home/node/app
 COPY /myFolder .
 USER node
 COPY --chown=node:node . .
 RUN ["chmod", "777", "/home/node/app"]
 ENTRYPOINT /home/node/app
 CMD ["node myApp.js"]

我正在使用docker构建镜像 "docker build -t my_docker_image ."  并没有出现错误。

接下来,我使用命令"docker run --name my_run_docker_image -d my_docker_image"运行它,并且也完成了没有错误,但是当我想使用"docker ps -l"命令检查我的新容器的状态时,我正在获取该容器的状态信息是“已终止”。

因此,我尝试使用命令"docker start -a my_run_docker_image"再次运行它,但收到错误消息:

  

“节点MyApp.js:1:节点myApp.js:/ home / node / app:权限被拒绝”

我试图以root用户(没有指定用户)运行它,但是每次遇到相同的问题。

2 个答案:

答案 0 :(得分:0)

看来您的用户添加命令可能有问题。

更改

RUN useradd -ms /bin/bash/node

RUN useradd -ms /bin/bash node

还有

RUN mkdir -p /home/node/app && -R node:node /home/node/app

需要更改为

RUN mkdir -p /home/node/app && chown -R node:node /home/node/app

答案 1 :(得分:0)

ENTRYPOINT和CMD告诉Docker启动容器时要运行什么命令。由于ENTRYPOINT是裸露的字符串,因此将其包裹在外壳中,而CMD将被忽略。因此,当您启动容器时,主要的容器过程是

/bin/sh -c '/home/node/app'

哪个失败了,因为那是一个目录。

在这个Dockerfile中,我大致建议两件事。首先是以root用户身份安装应用程序,然后以非root用户身份运行该应用程序,以防止意外覆盖应用程序代码。第二种情况是,在大多数情况下,CMD优先于ENTRYPOINT,除非您清楚它们之间的交互方式。您可能会想出更多类似的东西:

FROM node:4.2.6
MAINTAINER kamil
WORKDIR /app # Docker will create on first use
COPY myFolder .
RUN useradd node # its shell should never matter
USER node
CMD ["node", "myApp.js"]