Docker WORKDIR
在Dockerfile中WORKDIR也是相當常用的指令
首先來看看WORKDIR文檔
WORKDIR /path/to/workdir
WORKDIR
指令是用來設定RUN
, CMD
, ENTRYPOINT
, COPY
和 ADD
這些指令的工作目錄
如果沒有設定 WORKDIR
那麼預設會在根目錄 /
先來做個簡單的測試
mkdir workdir && cd $_
vi Dockerfile
#Dockerfile
FROM alpine
docker build -t workdirimage .
docker run -dit workdirimage
我們在這邊建立了一個空的alpine image,現在我們使用 docker attach
附加進去容器內部
目前container的工作目錄為根目錄
[node1] (local) root@192.168.0.13 ~/workdir
$ docker attach 5b6f
/ #
那麼我們來修改一下Dockerfile新增一個 WORKDIR
,在重新運行一個container試試看
#Dockerfile
FROM alpine
WORKDIR /usr
WORKDIR bin
發現我們的工作目錄已經被設定/usr/bin
底下了
docker build -t workdirimage .
docker run -dit workdirimage
[node1] (local) root@192.168.0.13 ~/workdir
$ docker attach bff
/usr/bin #
這邊要注意一下絕對路徑跟相對路徑的寫法
如果是像範例那樣有寫相對路徑,則結果會去參考前一個 WORKDIR
如果路徑為不存在的資料夾,則結果會建立一個新的資料夾
如果沒有設定WORKDIR
則會去參考依賴的image有沒有設定
所以為了避免被父層的image干擾,最好是建立自己的image時都要設定WORKDIR
Docker USER
跟WORKDIR
很相像,WORKDIR
是用來設定工作目錄
USER
則是用來設定container該使用哪個使用者和群組
並且會影響RUN
, CMD
和 ENTRYPOINT
這些指令的使用者與群組
簡單來說USER
指令是用來切換container內部的使用者和群組,需要注意跟我們HOST的使用者與群組不相關
因為USER
指令是用來切換container內部的使用者,所以要切換前必須要預先建立好否則切換會報錯
接下來測試看看
這邊我們建立了一個新的user叫做 user
,並且加入到 user
群組
FROM ubuntu
RUN groupadd -r user && useradd -r -g user user
USER user
docker build -t usertest .
docker run -dit usertest
可以看到目前登入的使用者變成是user
了
[node1] (local) root@192.168.0.28 ~/workdir
$ docker attach eda0c
user@eda0c9bc62e6:/$ id
uid=999(user) gid=999(user) groups=999(user)
Summary
今天學習了如何設定container的使用者與工作目錄
WORKDIR
設定工作目錄
USER
設定使用者
其中 WORKDIR
在搭配COPY
或 RUN
運行指令時非常方便
之後可以多加使用