iT邦幫忙

0

學Dockerfile的疑問

  • 分享至 

  • xImage

最近在自學寫dockerfile
目前是在centos上裝docker練習
看了很多網路解釋還是看不太懂
請各位高手白話點醒我

指令問題
FROM 基底映像指的是我目前操作的環境嗎
RUN 到底是指跑docker build還是docker run做的動作呢
CMD和ENTRYPOINT,我看了很多教學最看不懂這個作用

剛開始試著寫
FROM centos
RUN yum -y install httpd
跑docker build就會顯示 RUN這行錯誤

有點混亂

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
補覺鳴詩
iT邦高手 1 級 ‧ 2023-07-16 19:26:18

FROM 基底映像指的是我目前操作的環境嗎

是 告訴 docker 你現在要在哪個 container 操作

RUN 到底是指跑docker build還是docker run做的動作呢

RUN 就是要在此 container 內執行的指令
跟 docker 無關
另外既然你是 dockerfile 就是在執行 build 的動作

CMD 和 ENTRYPOINT,我看了很多教學最看不懂這個作用

CMD 會被 append 在 ENTRYPOINT 後
隨便找個範例應該不難理解 https://www.educative.io/answers/how-are-cmd-and-entrypoint-different-in-a-dockerfile

剛開始試著寫
FROM centos
RUN yum -y install httpd
跑docker build就會顯示 RUN這行錯誤

建議你提昇一下發問技巧
遇到 error 就把 error 貼出來
不然你光說遇到 error
error 有百百種情況, 誰知道你遇到什麼?

如果你遇到的 error 跟我一樣

 => ERROR [centos 2/2] RUN yum -y install httpd     1.8s
> [centos 2/2] RUN yum -y install httpd:       
1.626 CentOS Linux 8 - AppStream      32  B/s |  38  B     00:01    
1.630 Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

其實把訊息拿去丟 google 就有答案了
https://techglimpse.com/failed-metadata-repo-appstream-centos-8/

基本上就是 centos 已死
請換別的 container
可用 rockylinux
or centos-stream

謝謝 我再多練習

tombo iT邦高手 1 級 ‧ 2023-08-02 19:22:02 檢舉

你要先更新軟體清單,因為 Base Image 通常會把相關檔案都清掉,以縮減 Image Size

2
chan15
iT邦新手 2 級 ‧ 2023-07-17 11:07:34

FROM 是指你要從 docker hub 上抓哪一個 image 下來使用

RUN 是指你 image build 的過程你要跑那些東西,像是你可以 build 一個屬於自己的 ffmpeg 工具包,因此你的 base image ready 好後就可以下一系列的 RUN 指令裝好你想要的套件

CMDENTRYPOINT 這點蠻重要的,你可去看很多大 Image 裡面有很多 entrypoint.sh 的做法,最常見的作用應該就是 hang 住服務,你的 container 沒有 daemon 的話執行完會自動關閉,通常可以這樣理解,entrypoint 用在 build image,cmd 用在 image build 好後複寫或延伸 entrypoint 指令用

謝謝!

0
tombo
iT邦高手 1 級 ‧ 2023-08-02 19:20:49

你自己無法憑空建立產生一個 Docker Container 的 Base Image,
FROM 就是指定你要當基底的 Image

RUN 則是指,你要在基底 Image 裡面,執行那些動作、安裝那些程式,把這些程式、資料一併打包到新的 Container Image 裡(包含你要 Container 執行的程式)

CMD 跟 ENTRYPOINT 差別在於,CMD 在 Run Container 時的命令可以被更換成使用者指定的指令,而ENTRYPOINT 不行

謝謝!

我要發表回答

立即登入回答