iT邦幫忙

2023 iThome 鐵人賽

0
DevOps

跟著菜鳥手把手用Docker建立服務系列 第 10

Day10 - 跟著菜鳥一起學習DockerFile

  • 分享至 

  • xImage
  •  

什麼是DockerFile呢?在前面幾天大概對Docker有個基本的運作概念,可以把他想像把Docker一長串指令整理成一個檔,方便修改及管理,重點是方便閱讀


我們來了解基本DockerFile如何使用

先創建一個名為DockerFile的檔案

FROM "Image Name":"Tag"

ENV "Environment Value Name" = "Environment Value"
ARG "MY_ARG"="Default Value"

RUN "Command"

COPY "Local Path" "Container Path"
ADD  "Local Path" "Container Path"

WORKDIR "Container Path"

CMD ["Container Start Run Command"]
ENTRYPOINT ["Container Start Run Command"]
  • 基礎環境
    • FROM "Image Name":"Tag" 指定基礎映像,即你要建立映像的基礎系統和應用程式
      翻譯成指令 => docker pull "Image Name":"Tag"
  • 環境變量(ENV)、構建參數(ARG)
    • ENV "Environment Value Name" = "Environment Value" 設定環境變數,用於在容器內部定義環境配 置 翻譯成指令 => docker run -e Environment Value Name=Environment Value
    • ARG "MY_ARG"="Default Value" 定義了一個名為 MY_ARG 的建立時變數,其默認值為 Default Value
      翻譯成指令 => docker build --build-arg MY_ARG=Default Value -t Image Name .
    • ENV 就是設定 environment,因此概念上,它會是一個全域變數,一直到 docker run
        的時候都還會存在的變數。
    • ARG 是一個很像 ENV 的指令,不一樣的點主要在於,它只能活在 build image 的過程裡
    • ARG 不只是 build image 階段的變數,它可以在下指令的時候一併設值:
      https://ithelp.ithome.com.tw/upload/images/20231214/20158512CjLck6F1ym.png
      https://ithelp.ithome.com.tw/upload/images/20231214/20158512EdSrhaBS1k.png
    • 使用 ENV 可以讓 Dockerfile 更好維護,而 ARG 則是可以讓同一份 Dockerfile 產生更多不一樣的 image
  • 在基礎環境執行的指令
    • RUN "Command" 執行命令,通常用於安裝軟體、配置環境等
      翻譯成指令 => docker run -it "Image Name" /bin/bash -c "Command"
  • 複製(COPY)、加入(ADD)容器裡
    • COPY "Local Path" "Container Path" 將本地文件或目錄複製到容器內部
      翻譯成指令 => docker cp "Local Path" "Container Name":"Container Path"
    • ADD "Local Path" "Container Path" 將本地文件或目錄複製到容器內部
      翻譯成指令 => Docker 並沒有提供ADD指令的功能
    • ADD 和 COPY 都可以把local的一個複製、增加到容器裡,如果目標目錄不存在,則會自動創建
    • ADD 比 COPY 高級一點的地方就是,如果複製的是一個gzip等壓縮文件時,ADD會幫助我們自動去解壓縮文件
    • 因此在COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,一般的檔案就用COPY,如果有解壓縮的文件用 ADD
  • 指定目錄路徑
    • WORKDIR "Container Path" 設定工作目錄,即後續指令的執行目錄,也就是說當你啟動容器時訪問的目錄路 徑 翻譯成指令 => docker run -w "Container Path" "Image Name"
    • 如果Container Path Folder不存在,則會自動創建
    • WORKDIR 想像成 cd Container Path
  • 容器啟動命令
    • CMD ["Container Start Run Command"] 定義容器啟動時要運行的命令
      • 容器啟動時默認執行的命令
      • 如果docker container run啟動容器時指定了其他命令,則CMD命令會被忽略
      • 如果定義了多個CMD,只有最後一個會被執行
    • ENTRYPOINT ["Container Start Run Command"]定義容器啟動時要運行的命令
      • CMD設置的命令,可以在docker container run時傳入其他命令,覆蓋掉CMD的命令,但ENTRYPOINT,所 設置的命令是一定會被執行的
    • ENTRYPOINT和CMD可以聯合使用,ENTRYPOINT設置執行的命令,CMD傳遞參數
    • 翻譯成指令 => docker run your_image sh -c "CMD or ENTRYPOINT Command"

DockerFile是不是一個很重要的概念啊,我們不用打一長串的指令,而且他就是個文件,爾且可讀性很高/images/emoticon/emoticon07.gif


上一篇
Day9 - 菜鳥的足跡紀錄 Volume 人生第三課
下一篇
Day11 - 菜鳥們學以致用DockerFile MySql篇
系列文
跟著菜鳥手把手用Docker建立服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言