Docker的Dockerfile腳本基本使用指南

Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。它們簡(jiǎn)化了從頭到尾的流程并極大的簡(jiǎn)化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數(shù)。其產(chǎn)出為一個(gè)新的可以用于創(chuàng)建容器的鏡像。
Dockerfile 語(yǔ)法
在我們深入討論Dockerfile之前,讓我們快速過一下Dockerfile的語(yǔ)法和它們的意義。
什么是語(yǔ)法?
非常簡(jiǎn)單,在編程中,語(yǔ)法意味著一個(gè)調(diào)用命令,輸入?yún)?shù)去讓應(yīng)用執(zhí)行程序的文法結(jié)構(gòu)。這些語(yǔ)法被規(guī)則或明或暗的約束。程序員遵循語(yǔ)法規(guī)范以和計(jì)算機(jī) 交互。如果一段程序語(yǔ)法不正確,計(jì)算機(jī)將無法識(shí)別。Dockerfile使用簡(jiǎn)單的,清楚的和干凈的語(yǔ)法結(jié)構(gòu),極為易于使用。這些語(yǔ)法可以自我釋義,支持注釋。
Dockerfile 語(yǔ)法示例
Dockerfile語(yǔ)法由兩部分構(gòu)成,注釋和命令+參數(shù)
一個(gè)簡(jiǎn)單的例子:
# Print "Hello docker!"
RUN echo "Hello docker!"
Dockerfile 命令
Dockerfile有十幾條命令可用于構(gòu)建鏡像,下文將簡(jiǎn)略介紹這些命令。
FROM 命令
FROM <image>
或
FROM <image>:<tag>
這個(gè)設(shè)置基本的鏡像,為后續(xù)的命令使用,所以應(yīng)該作為Dockerfile的第一條指令。
比如:
FROM ubuntu
如果沒有指定 tag ,則默認(rèn)tag是latest,如果都沒有則會(huì)報(bào)錯(cuò)。
RUN 命令
RUN命令會(huì)在上面FROM指定的鏡像里執(zhí)行任何命令,然后提交(commit)結(jié)果,提交的鏡像會(huì)在后面繼續(xù)用到。
兩種格式:
RUN <command> (the command is run in a shell - `/bin/sh -c`)
或:
RUN ["executable", "param1", "param2" ... ] (exec form)
RUN命令等價(jià)于:
docker run image command
docker commit container_id
注釋
使用 # 作為注釋
如:
# Memcached
#
# VERSION 1.0</p> <p># use the ubuntu base image provided by dotCloud
FROM ubuntu</p> <p># make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update</p> <p># install memcached
RUN apt-get install -y memcached
MAINTAINER 命令
MAINTAINER <name>
MAINTAINER命令用來指定維護(hù)者的姓名和聯(lián)系方式
如:
MAINTAINER Guillaume J. Charmes, guillaume@dotcloud.com
ENTRYPOINT 命令
有兩種語(yǔ)法格式,一種就是上面的(shell方式):
ENTRYPOINT cmd param1 param2 ...
第二種是 exec 格式:
ENTRYPOINT ["cmd", "param1", "param2"...]
如:
ENTRYPOINT ["echo", "Whale you be my container"]
ENTRYPOINT 命令設(shè)置在容器啟動(dòng)時(shí)執(zhí)行命令
root@tankywoo-docker:~# cat Dockerfile
FROM ubuntu
ENTRYPOINT echo "Welcome!"</p> <p>root@tankywoo-docker:~# docker run 62fda5e450d5
Welcome!
USER 命令
比如指定 memcached 的運(yùn)行用戶,可以使用上面的 ENTRYPOINT 來實(shí)現(xiàn):
ENTRYPOINT ["memcached", "-u", "daemon"]
更好的方式是:
ENTRYPOINT ["memcached"]
USER daemon
EXPOSE 命令
EXPOSE 命令可以設(shè)置一個(gè)端口在運(yùn)行的鏡像中暴露在外
EXPOSE <port> [<port>...]
比如memcached使用端口 11211,可以把這個(gè)端口暴露在外,這樣容器外可以看到這個(gè)端口并與其通信。
EXPOSE 11211
一個(gè)完整的例子:
# Memcached
#
# VERSION 2.2</p> <p># use the ubuntu base image provided by dotCloud
FROM ubuntu</p> <p>MAINTAINER Victor Coisne victor.coisne@dotcloud.com</p> <p># make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update</p> <p># install memcached
RUN apt-get install -y memcached</p> <p># Launch memcached when launching the container
ENTRYPOINT ["memcached"]</p> <p># run memcached as the daemon user
USER daemon</p> <p># expose memcached port
EXPOSE 11211
上面是官方例子,國(guó)內(nèi)建議換成163或sohu的源,不然太慢了。
root@tankywoo-docker:~# docker build -t tankywoo - < dck [38/480]
Uploading context 2.56 kB
Uploading context
Step 0 : FROM ubuntu
---> 99ec81b80c55
Step 1 : MAINTAINER Victor Coisne victor.coisne@dotcloud.com
---> Using cache
---> 2b58110877f6
Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
---> Running in f55a4a8bb069
---> d48c6a965398
Step 3 : RUN apt-get update
---> Running in da091a1dd6e7
Ign http://mirrors.163.com precise InRelease
Get:1 http://mirrors.163.com precise Release.gpg [198 B]</p> <p>....</p> <p>Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for ureadahead (0.100.0-16) ...
---> 2886671b5b86
Step 5 : ENTRYPOINT ["memcached"]
---> Running in e8aeeab92cb6
---> 7148293a4053
Step 6 : USER daemon
---> Running in 288766b19606
---> 235e7f630ffa
Step 7 : EXPOSE 11211
---> Running in c6f881b9d51f
---> 666c5d65f396
Successfully built 666c5d65f396
Removing intermediate container f55a4a8bb069
Removing intermediate container da091a1dd6e7
Removing intermediate container f23631d3d45a
Removing intermediate container e8aeeab92cb6
Removing intermediate container 288766b19606
Removing intermediate container c6f881b9d51f
ENV 命令
用于設(shè)置環(huán)境變量
ENV <key> <value>
設(shè)置了后,后續(xù)的RUN命令都可以使用。
使用此dockerfile生成的image新建container,可以通過 docker inspect 看到這個(gè)環(huán)境變量:
root@tankywoo-docker:~# docker inspect 49bfc7a9817f
...
"Env": [
"name=tanky",
"HOME=/",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
...
里面的name=tanky就是設(shè)置的。
也可以通過在docker run時(shí)設(shè)置或修改環(huán)境變量:
docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash
ADD 命令
從src復(fù)制文件到container的dest路徑:
ADD <src> <dest>
<src> 是相對(duì)被構(gòu)建的源目錄的相對(duì)路徑,可以是文件或目錄的路徑,也可以是一個(gè)遠(yuǎn)程的文件url
<dest> 是container中的絕對(duì)路徑
VOLUME 命令
VOLUME ["<mountpoint>"]
如:
VOLUME ["/data"]
創(chuàng)建一個(gè)掛載點(diǎn)用于共享目錄
WORKDIR 命令
WORKDIR /path/to/workdir
配置RUN, CMD, ENTRYPOINT 命令設(shè)置當(dāng)前工作路徑
可以設(shè)置多次,如果是相對(duì)路徑,則相對(duì)前一個(gè) WORKDIR 命令
比如:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
其實(shí)是在 /a/b/c 下執(zhí)行 pwd
CMD 命令
有三種格式:
CMD ["executable","param1","param2"] (like an exec, preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (as a shell)
一個(gè)Dockerfile里只能有一個(gè)CMD,如果有多個(gè),只有最后一個(gè)生效。
相關(guān)文章
輕松玩轉(zhuǎn)虛擬機(jī)套娃! 在Hyper-V中開啟嵌套虛擬化的技巧
有辦法在虛擬機(jī)中創(chuàng)建虛擬機(jī)嗎?答案是肯定的,在虛擬機(jī)中運(yùn)行虛擬機(jī)是可能的,我們將其稱為嵌套虛擬化,下面我們就來看看詳細(xì)操作方法2025-02-19龍蜥操作系統(tǒng)Anolis OS-23.x安裝配置圖解教程(保姆級(jí))
本文主要介紹了安裝和配置AnolisOS 23.2系統(tǒng),包括分區(qū)、軟件選擇、設(shè)置root密碼、網(wǎng)絡(luò)配置、主機(jī)名設(shè)置和禁用SELinux的步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-20VMware虛擬機(jī)怎么復(fù)制/克隆/導(dǎo)出VMDK文件?
在處理文件拷貝復(fù)制到VMware虛擬機(jī)中的任務(wù)時(shí),有多種方法可以實(shí)現(xiàn)文件的高效傳輸,使用這些方法,可以在不同的操作系統(tǒng)和環(huán)境下,實(shí)現(xiàn)文件的快速、安全遷移,詳細(xì)請(qǐng)看下文2024-09-24統(tǒng)信 UOS V20 桌面專業(yè)版更新發(fā)布:附更新內(nèi)容匯總
統(tǒng)信 UOS V20 桌面專業(yè)版(1070u1)正式發(fā)布,支持微信掃碼登錄、應(yīng)用窗口縮略圖,海量功能修復(fù),詳細(xì)請(qǐng)看下文介紹2024-08-08怎么看自己IP地址? 不同的操作系統(tǒng)中查看路由器的IP地址的方法
在互聯(lián)網(wǎng)上進(jìn)行網(wǎng)絡(luò)連接,每個(gè)設(shè)備都有一個(gè)唯一的標(biāo)識(shí),即IP地址,本文介紹了如何在不同平臺(tái)上查找路由器的IP地址,包括Windows、Mac、iPhone、iPad、Android、Chrome OS和2024-07-16mware虛擬機(jī)運(yùn)行速度卡慢原因分析及解決辦法
很多人在使用虛擬機(jī)系統(tǒng)的時(shí)候,經(jīng)常對(duì)虛擬機(jī)的運(yùn)行速度不甚滿意,甚至經(jīng)常很惱火,虛擬機(jī)速度慢有很多原因,每個(gè)人需要根據(jù)自己的情況具體分析,本文根據(jù)筆者的使用經(jīng)驗(yàn)將2024-02-21Vmware虛擬機(jī)如何與主機(jī)之間直接復(fù)制粘貼文件?
使用虛擬機(jī)的時(shí)候,遇到了錯(cuò)誤,想要把錯(cuò)誤的代碼或是運(yùn)行情況復(fù)制粘貼到Windows的網(wǎng)上論壇區(qū)求助大神,該怎么操作呢?詳細(xì)請(qǐng)看下文介紹2024-02-21統(tǒng)信UOS V20桌面專業(yè)版(1060)11月更新發(fā)布(附更新內(nèi)容匯總)
國(guó)產(chǎn)桌面操作系統(tǒng)統(tǒng)信 UOS V20 專業(yè)版(1060)11月更新發(fā)布,這是統(tǒng)信 UOS V20 專業(yè)版(1060)2023 年度最后一次更新,下面我們就來看看詳細(xì)的更新內(nèi)容2023-12-01統(tǒng)信 UOS 將推 Rust 版 Bash 命令行工具 utshell(附下載地址)
統(tǒng)信 UOS 服務(wù)器版將于不久后推出 Rust 版 Bash,名為 utshell,旨在突破傳統(tǒng) Shell 所面臨的安全限制,詳細(xì)請(qǐng)看下文介紹2023-09-20UOS開機(jī)進(jìn)入busybox界面怎么辦 uos無法進(jìn)入桌面的解決辦法
UOS開機(jī)進(jìn)入busybox界面怎么辦?UOS系統(tǒng)開機(jī)黑屏進(jìn)入busybox界面了,該怎么辦呢?下面我們就來看看uos無法進(jìn)入桌面的解決辦法2023-09-06