Dockerfile mkdir 权限被拒绝

Gum*_*dru 5 bash sh docker

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

docker build -t db-demo .
Run Code Online (Sandbox Code Playgroud)

但我明白了

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
Run Code Online (Sandbox Code Playgroud)

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

Tur*_*g85 9

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

docker run -it --rm mcr.microsoft.com/mssql/server /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

mssql@ed73727870bb:/$ whoami
mssql
Run Code Online (Sandbox Code Playgroud)

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

mssql@ed73727870bb:/$ ls -lisa /usr | grep -i src
163853 4 drwxr-xr-x 2 root root 4096 Apr 15  2020 src
Run Code Online (Sandbox Code Playgroud)

我们看到只有对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
Run Code Online (Sandbox Code Playgroud)

如果我们构建并运行它Dockerfile

docker build -t turing85/my-mssql -f Dockerfile .
docker run -it --rm turing85/my-mssql /bin/bash
Run Code Online (Sandbox Code Playgroud)

我们现在可以看到:

  • 活跃用户仍然是mssql

    mssql@85e401ccc3f9:/usr/src/app$ whoami
    mssql
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件/usr/src/app/hello.txt已创建,并且用户mssql具有读取权限:

    mssql@85e401ccc3f9:/usr/src/app$ cat hello.txt
    Hello from user mssql
    
    Run Code Online (Sandbox Code Playgroud)
  • 用户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
    
    Run Code Online (Sandbox Code Playgroud)
  • 用户mssql无权写入/usr/src

    mssql@85e401ccc3f9:/usr/src/app$ touch ../test2.txt
    touch: cannot touch '../test2.txt': Permission denied
    
    Run Code Online (Sandbox Code Playgroud)

Dockerfile对帖子中的评论:

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