簡體   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