微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

docker 镜像中的文件始终归 root 所有

如何解决docker 镜像中的文件始终归 root 所有

我的 docker 文件

FROM mcr.microsoft.com/playwright:focal as influencer-scraper

USER root

# Install tools as telnet
RUN apt-get update && apt-get install telnet -y
# RUN apk add chromium

RUN groupadd --gid 888 node \
    && useradd --uid 888 --gid node --shell /bin/bash --create-home node

USER node
workdir /home/node
# copy package.json and Yarn install (separate for cache)
copY ./package.json ./
copY ./yarn.lock ./
RUN yarn
# copy everything and build
copY . .
# copy other config files
copY ./.env ./.env

# Entry point
ENTRYPOINT ["yarn","start"]
CMD ["--mongodb","host.docker.internal:27017"]

然而,我登录docker镜像后,发现所有文件都归root所有,这在运行时造成了麻烦

➜  influencer-scraper-js git:(master) ✗ docker run -it --entrypoint /bin/bash influencer-scraper:v0.1-6-gfe17ad4962-dirty
node@bce54c1024db:~$ ls -l
total 52
-rw-r--r--. 1 root root   542 Apr 16 04:15 Docker.md
-rw-r--r--. 1 root root   589 Apr 16 05:03 Dockerfile
-rw-r--r--. 1 root root   570 Apr 16 03:58 Makefile
-rw-r--r--. 1 root root   358 Apr 13 01:27 README.md
drwxr-xr-x. 1 root root    20 Apr 16 03:58 config
drwxr-xr-x. 1 root root    16 Apr 16 03:58 data
drwxr-xr-x. 1 root root    14 Apr 12 06:00 docker
-rw-r--r--. 1 root root   558 Apr 16 03:58 docker-compose.yml
drwxr-xr-x. 1 root root   140 Apr 13 01:27 generated
drwxr-xr-x. 1 root root  1676 Apr 16 04:47 node_modules
-rw-r--r--. 1 root root   583 Apr 16 03:58 package.json
drwxr-xr-x. 1 root root    34 Apr 13 01:27 proxy
drwxr-xr-x. 1 root root    40 Apr 13 01:27 src
-rw-r--r--. 1 root root 26230 Apr 16 03:58 yarn.lock

我该如何解决这个问题?我希望工作目录仍归用户 node 所有。

解决方法

引用 Docker 文档:https://docs.docker.com/engine/reference/builder/#copy

COPY 有两种形式:

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

如果您未在 --chown 中指定任何用户,则使用的默认值为 root

所有新文件和目录都使用 0 的 UID 和 GID 创建,除非可选的 --chown 标志指定给定的用户名、组名或 UID/GID 组合以请求复制内容的特定所有权。


您也可以尝试在复制后执行 chown

chown root:node filename
,

您显示的文件列表在我看来几乎是正确的。您希望大部分文件都归 root 所有,而不是全局可写:如果您的代码中存在一些安全问题或其他错误,您不希望那样意外覆盖您的源文件、静态资产或其他内容。

这意味着您需要将实际的可写数据存储在不同的目录中,并且您的列表包含一个 data 目录,该目录可能起到此作用。您可以在 Dockerfile 中chown

为了清楚起见,在文件结束之前一直保持 root 用户身份是有帮助的,然后您可以声明备用用户来实际运行容器。

# USER root (if required)
RUN chown node data
...
USER node
CMD ["yarn","start"]

当您启动容器时,您可以在该特定目录上挂载一个卷。此设置应按原样使用命名卷

docker run \
  -v app_data:/home/node/data \
  ...

如果您想/需要使用主机目录来存储数据,您还需要指定拥有该目录的主机用户 ID(通常是当前用户)。同样,应用程序代码将由 root 拥有并且是世界可读的,所以这不会改变;只有 data 目录的内容和所有权很重要。

docker run \
  -u $(id -u) \
  -v "$(pwd)/app_data:/home/node/data" \
  ...

(不要使用卷来替换容器中的应用程序代码或库。在这种特殊情况下,这样做会掩盖 Dockerfile 中的此配置问题,并且当您尝试在没有本地构建卷。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。