Docker:非root用户使用卷时没有写入权限

abc*_*123 3 docker dockerfile

我有以下 Dockerfile:

...

RUN groupadd -r myuser&&  useradd -r -g myuser myuser

RUN mkdir /data && chmod a+rwx /data

USER myuser

...
Run Code Online (Sandbox Code Playgroud)

运行图像docker run工作正常(我的意思是用户在目录myuser中具有写入权限/data)。

如果我使用 运行图像docker run -v /host/path:/data,用户myuser将无法在目录中写入/data

问题:在第二种情况下如何授予用户myuser在目录中写入的权限?/data


原因是该/host/path目录属于 root 用户,并且用户myuser没有在此类目录中写入的权限。

Dav*_*aze 5

您可以使用与拥有该目录的主机用户 ID 匹配的用户 ID 来运行容器。通常这是当前用户:

 docker run -u $(id -u) -v /host/path:/container/path ...
Run Code Online (Sandbox Code Playgroud)

为此,您的图像需要执行以下操作:

  • 数据需要保存在与应用程序代码完全分开的地方。您显示的顶级/data目录是一个不错的选择。
  • 应用程序本身应该由root拥有,并且是世界可读的,但不是世界可写的;不要运行RUN chown ...应用程序,只需将COPY其放入并以 root 身份运行其构建序列。
  • 该映像应创建一个非 root 用户,但不需要匹配任何特定的主机用户。
  • 图像需要创建数据目录,但它应该完全为空。
  • 如果启动时数据目录完全为空,则映像启动(通常是入口点包装器脚本)需要能够填充数据目录。
FROM some-base-image

# Do all of the initial setup and build as root
WORKDIR /app
COPY . .
RUN ...

# Create some non-root user that owns the data directory by default
RUN useradd -r myuser          # no specific user ID
RUN mkdir /data && chown myuser /data
# VOLUME ["/data"]             # optional, the only place VOLUME makes sense at all

# Specify how to run the container
USER myuser                    # not earlier than this
EXPOSE ...                     # optional but good practice
ENTRYPOINT ["/entrypoint.sh"]  # knows how to seed /data, then `exec "$@"`
CMD my_app ...                 # a complete command line
Run Code Online (Sandbox Code Playgroud)