[英]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
應位於文件的最后,靠近其他啟動時指令,如EXPOSE
和CMD
。 您不應將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.