簡體   English   中英

非 root 用戶 dockerfile 中 USER 指令的確切順序

[英]Exact sequence of USER instruction in dockerfile for non-root user

dockerfile 中 USER 指令的確切順序應該是什么,以便新用戶在執行 dockerfile 時自行執行所有 COPY、MKDIR、CMD?

Dockerfile

FROM node:12-slim

RUN groupadd --gid 5000 newuser \
    && useradd --home-dir /home/newuser --create-home --uid 5000 \
         --gid 5000 --shell /bin/sh --skel /dev/null newuser


EXPOSE 3000

RUN mkdir /app && chown -R newuser:newuser /app

WORKDIR /app

USER newuser

COPY --chown=newuser:newuser package.json package-lock*.json ./

RUN npm install && npm cache clean --force

COPY --chown=newuser:newuser . .

CMD ["npm", "start"]

USER 指令的順序是否會影響新用戶在容器內的可訪問性?

看到這個

USER 指令設置運行映像時使用的用戶名(或 UID)和可選的用戶組(或 GID),以及 Dockerfile 中的任何 RUN、CMD 和 ENTRYPOINT 指令。

從文檔中,您可以看到USER之后的所有RUN, CMD, ENTRYPOINT都會受到影響。

另一個詞,下一個:

USER a1
RUN mkdir /tmp/a1
USER a2
RUN mkdir /tmp/a2

USER指令將按照您在 Dockerfile 中定義的順序執行, /tmp/a1將設置為user a1權限,而/tmp/a2將設置為user a2權限。 CMD, ENTRYPOINT等也是如此。

根據您的評論更新:

首先,您需要了解linux 權限,無論是在容器內還是在容器外,您都無法獲得此權限。

  • 下一步將不起作用,例如:

     FROM ubuntu:16.04 RUN useradd appuser WORKDIR /opt/myfolder USER appuser RUN touch abc.txt

    它將報告:

    步驟 5/5:運行 touch abc.txt
    ---> 在 c942c1e99386 中運行
    觸摸:無法觸摸'abc.txt':權限被拒絕

    這是因為您在root使用默認權限設置的文件夾中使用用戶appuser設置了abc.txt-rw-r--r-- ,也就是644 ,這意味着其他用戶無法在此文件夾中設置文件.

    請記住,容器的東西也僅限於 linux 權限。

  • 下一步將起作用,因為您使用 root 更改/opt/myfolder的權限:

     FROM ubuntu:16.04 RUN useradd appuser WORKDIR /opt/myfolder RUN chown -R appuser:appuser /opt/myfolder USER appuser RUN touch abc.txt

所以,這真的取決於你需要什么,事實上,你的問題不是 docker 問題,而是how in linux a non-root user could setup/run resource in a root folder ......

非 root USER應位於文件的最后,靠近其他啟動時指令,如EXPOSECMD 您不應將COPY --chown文件復制給非 root 用戶。

這將導致/app目錄和其中的文件歸 root 所有。 這是一件好事,因為您的應用程序不是以 root 身份運行的,如果存在某種可能導致文件被意外覆蓋的問題。 您實際上沒有權限覆蓋您的應用程序代碼或 static 資產。

FROM node:12-slim

# Create some non-root user.  We don't care about its uid,
# home directory, shell, or most of the other options.
RUN useradd --system --user-group newuser

# Also creates the directory (owned by root).
WORKDIR /app

# Copy and build the application (as root).
COPY package.json package-lock*.json ./
RUN npm ci
COPY . .

# Explain how to run a container based on the application.
# Set `USER` now, but not earlier: the container will run as this
# user, but can't overwrite files in the image.
EXPOSE 3000
USER newuser
CMD ["npm", "start"]

許多 Node 應用程序似乎喜歡用卷替換圖像內容。 如果你也這樣做,Dockerfile 中的所有內容都將被忽略,以支持綁定安裝的圖像內容,除了你的node_modules樹將使用來自匿名卷的舊版本。 您需要刪除 Compose volumes:為了查看 Dockerfile 所做的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM