【问题标题】:files in docker image always owned by rootdocker 映像中的文件始终归 root 所有
【发布时间】:2021-07-11 03:21:30
【问题描述】:

我的 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

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

【问题讨论】:

    标签: docker yarnpkg


    【解决方案1】:

    您显示的文件列表在我看来几乎是正确的。您希望大部分文件归 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 中的此配置问题,并且当您尝试在没有本地构建卷。)

    【讨论】:

      【解决方案2】:

      引用 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
      

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多