Docker的Dockerfile是用來建構docker images的指令檔。
Dockerfile是由Dockerfile指令組成的文字檔。可在Docker CLI使用docker build
執行Dockerfile來建構docker image。
docker build
會透過Dockerfile及build context來建構docker image。build context為PATH
或URL
路徑的檔案及子目錄中的檔案。PATH
為檔案系統目錄,URL
為Git repository。
例如docker build /docker/mycontext
使用檔案系統根目錄下的/docker/mycontext
目錄為build context。
$ docker build /docker/mycontext
docker build https://github.com/user/app.git#demo:docker
使用git repository https://github.com/user/app.git
分支demo
下的docker
目錄為build context。
$ docker build https://github.com/user/app.git#demo:docker
docker build
是由Docker daemon執行,而非Docker CLI(也就是操作docker指令的地方)。build時Docker會將build context的檔案送到daemon,因為build過程中需要參考build context中的檔案來建構image。通常會把Dockerfile放在build context的目錄中,並在該目錄執行docker build
確保build context僅限於該目錄中的檔案。
注意不要將build context設為檔案系統根目錄/
,否則build會將整個根目錄及下面所有的子目錄及檔案都送到Docker daemon。
下面示範在macOS建構一個以centos 7為base image,並在上面執行shell script檔的docker image。
範例環境:
- macOS Catalina
- Docker 19.03.12
在~/Document
新建一個目錄temp
,此即為待會docker build
使用的build context。
在~/Document/temp
新增一個script.sh
內容如下。此檔案為執行Dockerfile
時要搬移到image並被執行的shell script檔。
script.sh
#!/bin/bash
echo hello world
在~/Document/temp
目錄新增一個文字檔命名為Dockerfile
且不用副檔名內容如下。此即為docker build
使用的Dockerfile。
Dockerfile
FROM centos:7
COPY script.sh /tmp/script.sh
RUN ls tmp
RUN ./tmp/script.sh
Dockerfile中必須以FROM
開頭,用來指定container的base image,這邊以centos:7
為base image。
COPY
用來將build context中的script.sh
複製到container檔案目錄下的/tmp/script.sh
。
RUN
用來執行container的shell指令。首先使用ls tmp
列出根目錄下的tmp
目錄中的檔案,然後執行tmp
目錄下的script.sh
。script.sh
即為上一步COPY
從build context複製的script.sh
。
所以目前~/Document/temp
下有兩個檔案,分別為script.sh
及Dockerfile
。
~/Documents/temp$ ls
Dockerfile script.sh
在~/Document/temp
執行docker build -t script .
以當前目錄的Dockerfile建構image,image名稱為script
。-t
用來指定image名稱;PATH
設為.
即以當前目錄為build context。
~/Documents/temp$ docker build -t script .
Sending build context to Docker daemon 12.29kB
Step 1/4 : FROM centos:7
---> 8652b9f0cb4c
Step 2/4 : COPY script.sh /tmp/script.sh
---> ddce844d637b
Step 3/4 : RUN ls tmp
---> Running in 19a866dab496
ks-script-DrRL8A
script.sh
yum.log
Removing intermediate container 19a866dab496
---> 3b5e270fe3a7
Step 4/4 : RUN ./tmp/script.sh
---> Running in 290c5040a113
hello world
Removing intermediate container 290c5040a113
---> ebd440515a3e
Successfully built ebd440515a3e
Successfully tagged script:latest
從以上可看到Dockerfile
每一步命令的執行結果。
使用docker images
列出本機docker registry的images,即可見到建構好的script
images。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
script latest ebd440515a3e 2 minutes ago 204MB
輸入docker run -it --name script script
來執行image script
並以--name
將container命名為script
且以-it
在啟動後進入container的bash shell。
$ docker run -it --name script script
[root@8b429764e4d2 /]#
在container shell輸入ls tmp
檢視可看到script.sh
。
[root@8b429764e4d2 /]# ls tmp
ks-script-DrRL8A script.sh yum.log
沒有留言:
張貼留言