繁体   English   中英

Dockerfile mkdir 权限被拒绝

[英]Dockerfile mkdir permission denied

我正在尝试使用以下方法构建图像:

docker build -t db-demo .

但我明白了

RUN mkdir -p /usr/src/app: #5 0.512 mkdir: 无法创建目录 '/usr/src/app': 权限被拒绝

Dockerfile

FROM mcr.microsoft.com/mssql/server
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app
RUN chmod +x /usr/src/app/run-initialization.sh
ENV SA_PASSWORD bpassword
ENV ACCEPT_EULA Y
ENV MSSQL_PID Express
EXPOSE 1433

CMD /bin/bash ./entrypoint.sh

操作系统是 Windows。如何解决这个问题?

如果我们使用交互式 shell 启动mssql容器:

docker run -it --rm mcr.microsoft.com/mssql/server /bin/bash

然后查看容器内的活动用户:

mssql@ed73727870bb:/$ whoami
mssql

我们看到,活动用户是mssql 此外,如果我们查看容器内/usr/src的权限:

mssql@ed73727870bb:/$ ls -lisa /usr | grep -i src
163853 4 drwxr-xr-x 2 root root 4096 Apr 15  2020 src

我们看到只有root具有对目录/usr/src写访问权限。

因此,如果我们想创建一个目录/usr/src/app ,以便用户mssql可以写入它,我们必须将其设置为root并授予mssql适当的权限。 这导致以下Dockerfile

FROM mcr.microsoft.com/mssql/server

# change active user to root
USER root 

# create the app directory
RUN mkdir -p /usr/src/app

# set mssql as owner of the app directory
RUN chown mssql /usr/src/app

# change back to user mssql
USER mssql

WORKDIR /usr/src/app

# sanity check: try to write a file
RUN echo "Hello from user mssql" > hello.txt

如果我们构建并运行这个Dockerfile

docker build -t turing85/my-mssql -f Dockerfile .
docker run -it --rm turing85/my-mssql /bin/bash

我们现在可以看到:

  • 活动用户仍然是mssql

     mssql@85e401ccc3f9:/usr/src/app$ whoami mssql
  • 文件/usr/src/app/hello.txt已创建,用户mssql具有读取权限:

     mssql@85e401ccc3f9:/usr/src/app$ cat hello.txt Hello from user mssql
  • 用户mssql具有对/usr/src/app写访问权限:

     mssql@85e401ccc3f9:/usr/src/app$ touch test.txt && ls -lisa total 16 171538 4 drwxr-xr-x 1 mssql root 4096 Nov 6 20:13 . 171537 8 drwxr-xr-x 1 root root 4096 Nov 6 20:02 .. 171539 4 -rw-r--r-- 1 mssql root 17 Nov 6 20:02 hello.txt 171604 0 -rw-r--r-- 1 mssql root 0 Nov 6 20:13 test.txt
  • 用户mssql/usr/src没有写访问权限:

     mssql@85e401ccc3f9:/usr/src/app$ touch ../test2.txt touch: cannot touch '../test2.txt': Permission denied

帖子中对Dockerfile的评论:

似乎我们尝试将应用程序复制到mssql容器中。 我假设这样做是为了在同一个容器中启动所述应用程序。 虽然这是可能的(通过一些配置),但我强烈建议不要使用这种方法。 我们可以改为定义两个容器(一个用于数据库,一个用于应用程序),例如通过docker-compose文件

如果命名目录不存在, WORKDIR创建该目录。 如果您唯一的权限问题是在尝试创建目录时,您可以删除RUN mkdir行并让 Docker 为您创建目录。

FROM any-base-image
# Docker creates the directory if it does not exist
# You do not need to explicitly RUN mkdir
WORKDIR /usr/src/app
...

进一步查看此示例,如果基本映像具有无法访问 root 拥有的目录的非 root 用户,则RUN chmod ...行也可能会失败。 COPY也会从主机复制权限,所以如果文件在主机环境中是可执行的,你不需要在它被COPY后显式chmod +x它。这会让你删除所有的RUN行; 你会留下COPYENV指令以及运行时元数据,它们都不会遇到权限问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM