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
owan
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邦新手 1 級 ‧ 2023-07-17 11:07:34

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

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

CMD 跟 ENTRYPOINT 這點蠻重要的,你可去看很多大 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 不行

謝謝!

我要發表回答

立即登入回答