Docker EACCES 权限被拒绝 mkdir

标签 docker docker-compose chown

我的 friend 给了我一个带有 dockerfile 的项目,这似乎对他来说工作得很好,但我得到了一个权限错误。

FROM node:alpine

RUN mkdir -p /usr/src/node-app && chown -R node:node /usr/src/node-app

WORKDIR /usr/src/node-app

COPY package.json yarn.lock ./
COPY ./api/package.json ./api/
COPY ./iso/package.json  ./iso/

USER node
RUN yarn install --pure-lockfile

COPY --chown=node:node . .

EXPOSE 3000

error An unexpected error occurred: "EACCES: permission denied, mkdir '/usr/src/node-app/node_modules/<project_name>/api/node_modules'".

会不会是docker版本错误?

enter image description here

最佳答案

COPY 通常将内容复制到 root 拥有的镜像中,如果目录不存在,它将在镜像中创建目录。特别是,当您 COPY ./api/package.json ./api/ 时,它会创建 root 拥有的 api 子目录,当您稍后尝试运行 yarn install,它无法创建 node_modules 子目录,因为您已经切换了用户。

我建议将文件复制到容器中并以 root 身份运行构建过程。不要chown任何东西;将所有这些文件保留为 root 所有。仅在 Dockerfile 的末尾切换到备用 USER,您在其中声明 CMD。这意味着运行容器的非根用户将无法有意或无意地修改容器中的代码或库,这通常是一种良好的安全做法。

FROM node:alpine

# Don't RUN mkdir; WORKDIR creates the directory if it doesn't exist

WORKDIR /usr/src/node-app

# All of these files and directories are owned by root
COPY package.json yarn.lock ./
COPY ./api/package.json ./api/
COPY ./iso/package.json  ./iso/
# Run this installation command still as root
RUN yarn install --pure-lockfile

# Copy in the rest of the application, still as root
COPY . .
# RUN yarn build

# Declare how to run the container -- _now_ switch to a non-root user
EXPOSE 3000
USER node
CMD yarn start

关于Docker EACCES 权限被拒绝 mkdir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71163315/

相关文章:

centos - 目录的双重所有者

linux - 我应该使用 `*` 更快地 chown 一个文件夹中的所有文件吗?

Docker 集群模式 : scale down a node and remove services

docker - 如何在 Docker 容器中挂载 --bind?

Docker-compose 指定配置文件

mysql - docker-compose rails 与 mysql

docker - 如何在 Jenkins 中将外部 URL 显示为构建结果

Docker 副本丢失了一些文件

docker - 如何使用 docker compose 为容器创建私有(private) docker 卷

linux - 如何使用 setfacl 为用户开放对目录的访问