我正在嘗試使用以下方法構建影像:
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。如何解決這個問題?
uj5u.com熱心網友回復:
如果我們mssql使用互動式 shell啟動容器:
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對 directory 的寫訪問權限/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容器中。我假設這樣做是為了在mssql容器內啟動所述應用程式。雖然這是可能的(通過一些配置),但我強烈建議不要使用這種方法。我們可以改為定義兩個容器(一個用于資料庫,一個用于應用程式),例如通過docker-compose檔案。
uj5u.com熱心網友回復:
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
...
進一步查看此示例,RUN chmod ...如果基本映像具有無法訪問 root 擁有的目錄的非 root 用戶,則該行也可能會失敗。 COPY還將從主機復制權限,因此如果該檔案在主機環境中是可執行的,chmod x則在它被COPY編入后您將不需要顯式地將其洗掉。這將允許您洗掉所有RUN行;你會留下COPY,并ENV說明和運行時元資料,其中沒有一個應該遇到權限問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/353064.html
上一篇:將Docker卷掛載為非持久存盤
