帶你深入了解DockerFile指令
這篇文章為大家帶來了關於dockerFile命令的相關知識,該命令包含一條指令,每條指令構建一層的鏡像製作文件,希望對大家有幫助。
推薦學習:《docker影片教學》
DockerFile 指令詳解
Dockerfile 是包含一條指令,每條指令建構一層的鏡像製作檔。
建置映像
docker build [选项] <上下文路径/URL/-> docker build -t nginx:v3 . # . 表示Dockerfile在当前目录
FROM 指定基礎映像
透過FROM指定基礎映像,因此一個Dockerfile 中FROM 是必備的指令,且必須是第一條指令。
FROM scratch,這個鏡像是虛擬的概念,並不實際存在,它表示一個空白的鏡像,接下來的指令將作為鏡像第一層開始存在。
RUN 執行命令
RUN 用來執行命令列命令,其格式有兩種:
shell 格式:
RUN <命令> RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
Union FS 是有最大層數限制的,例如AUFS,曾經是最大不得超過42 層,現在是不得超過127 層,相同功能應該使用&& 將各個所需命令串聯起來簡化鏡像的層數
COPY 複製檔案
COPY [--chown=<user>:<group>] <宿主机源路径> <镜像内的目标路径> COPY [--chown=<user>:<group>] ["<宿主机源路径1>",... "<镜像内的目标路径>"]
# 把当前目录的a.txt文件复制到镜像的根目录 COPY a.txt /a.txt
ADD 複製檔案(下載檔案或解壓縮檔案)
#ADD [--chown=<user>:<group>] http://xxx <目标路径> # 下载文件到镜像的目标路径 ADD [--chown=<user>:<group>] ./a.tar.gz <目标路径> # 复制压缩包,并自动解压到目标路径
CMD 指定預設的容器主程序的啟動指令
CMD ["可执行文件", "参数1", "参数2"...]
# 指定进入容器马上指定 cat /a.txt CMD ["sh","-c", "cat /a.txt"]
執行docker run -it 映像的時候,如果不指定指令類似/bin/bash ,會自動執行sh -c cat /a.txt,否則會依使用者指定的CMD
ENTRYPOINT 指定容器主程序的啟動指令,類似CMD
格式與CMD一致,差異點
1、使用ENTRYPOINT可以傳參
在Dockerfile中指定ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ],命令列透過docker run myip -i 時,會把-i 參數傳給ENTRYPOINT 的指令,最後進入
容器時,容器會執行curl -s http://myip.ipip.net -i
2、執行一些與CMD 無關的初始化工作,與容器CMD 無關的,無論CMD 為什麼,都需要事先進行一個預處理的工作。
類似ENTRYPOINT ["docker-entrypoint.sh"] 這個腳本裡檢查使用者的身分是否合法等
ENV 設定環境變數
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
ARG 建構參數
ARG <参数名>[=<默认值>]
ARG 指令有生效範圍,如果在FROM 指令之前指定,那麼只能用於FROM 指令中。
ARG DOCKER_USERNAME=library FROM ${DOCKER_USERNAME}/alpine
如果在FROM之後指定,對於在各個階段中使用的變數都必須在每個階段分別指定
FROM ${DOCKER_USERNAME}/alpine # 在FROM 之后使用变量,必须在每个阶段分别指定 ARG DOCKER_USERNAME=library RUN set -x ; echo ${DOCKER_USERNAME}
VOLUME 匿名磁碟區
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径>
為了防止執行階段使用者忘記將動態檔案所保存目錄掛載為卷,在Dockerfile 中,可以事先指定某些目錄掛載為匿名卷,這樣在運行時如果使用者不指定掛載,其應用也可以正常運行,不會向容器儲存層寫入大量資料
這裡的/data 目錄就會在容器運行時自動掛載為匿名卷,任何向/data 寫入的資訊都不會記錄進容器儲存層,從而確保了容器儲存層的無狀態化。
EXPOSE 暴露端口
EXPOSE <端口1> [<端口2>...]
EXPOSE 指令是聲明容器運行時提供服務的端口,EXPOSE 只是聲明容器打算使用什麼端口而已,並不會自動在宿主進行連接埠映射。
在Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像用戶理解這個映像服務的守護端口,以方便配置映射;
另一個用處則是在執行時間使用隨機連接埠對映時,也就是docker run -P 時,會自動隨機對應EXPOSE 的連接埠。
要將 EXPOSE 和運行時使用 -p <宿主連接埠>:<容器連接埠> 區分開來。
-p,是映射宿主端口和容器端口,換句話說,就是將容器的對應端口服務公開給外界訪問。
WORKDIR 指定工作目錄,如目錄不存在,WORKDIR 會建立目錄
WORKDIR <工作目录路径>
範例1:
WORKDIR /app RUN echo "hello" > world.txt
範例2:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd ## RUN pwd 的工作目录为 /a/b/c
USER 指定目前使用者
USER <用户名>[:<用户组>]
如果以root 執行的腳本,在執行期間希望改變身份,例如希望以某個已經建立好的使用者來執行某個服務進程,不要使用su 或sudo,這些都需要比較麻煩的配置,而且在TTY 缺失的環境下經常出錯。建議使用 gosu。
# 建立 redis 用户,并使用 gosu 换另一个用户执行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下载 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true # 设置 CMD,并切换到redis用户执行 CMD [ "exec", "gosu", "redis", "redis-server" ]
HEALTHCHECK 告訴Docker 如何進行判斷容器的狀態是否正常
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
選項:
--interval=<间隔>:两次健康检查的间隔,默认为 30 秒; --timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒; --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次
當在一個映像指定了HEALTHCHECK 指令後,用其啟動容器,初始狀態會為starting,在HEALTHCHECK 指令檢查成功後變為healthy,如果連續一定次數失敗,則會變為unhealthy。
HEALTHCHECK 只可以出現一次,如果寫了多個,只有最後一個生效
CMD 命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败
ONBUILD 指定某些命令只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
ONBUILD <其它指令>
# 举例如下Dockerfile,初次构建为镜像my-node时,ONBUILD的三行命令不会执行 FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ] # 只要当其他镜像 FROM my-node 从上面镜像作为基础镜像进行构建时,ONBUILD 的命令开始执行
LABEL 为镜像添加元数据
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 标注镜像的作者 LABEL org.opencontainers.image.authors="yeasy"
SHELL 指定执行shell命令的参数
SHELL ["可执行程序", "参数"]
SHELL ["/bin/sh", "-c"] RUN lll ; ls # 这里的shell命令将通过 /bin/sh -c 的方式执行
推荐学习:《docker视频教程》
以上是帶你深入了解DockerFile指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

退出 Docker 容器的四種方法:容器終端中使用 Ctrl D 快捷鍵容器終端中輸入 exit 命令宿主機終端中使用 docker stop <container_name> 命令宿主機終端中使用 docker kill <container_name> 命令(強制退出)

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

Docker 中將文件拷貝到外部主機的方法:使用 docker cp 命令:執行 docker cp [選項] <容器路徑> <主機路徑>。使用數據卷:在主機上創建目錄,在創建容器時使用 -v 參數掛載該目錄到容器內,實現文件雙向同步。

重啟 Docker 容器的方法:獲取容器 ID(docker ps);停止容器(docker stop <container_id>);啟動容器(docker start <container_id>);驗證重啟成功(docker ps)。其他方法:Docker Compose(docker-compose restart)或 Docker API(參考 Docker 文檔)。

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]
