『中级篇』Dockerfile详解(17)
一般的,Dockerfile 分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令和容器啟動時執(zhí)行指令。
####官網(wǎng)學(xué)習(xí)
https://docs.docker.com/engine/reference/builder/#usage
####FROM
必須為第一個命令,指定基礎(chǔ)鏡像
FROM <image> FROM <image>:<tag> FROM <image>@<digest> FROM scratch #制作base Image FROM centos #使用base Image FROM centos:7.9 FROM mysql:5.6盡量使用官方的image作為base image!那是經(jīng)得起考驗(yàn)的!
####LABEL
給鏡像添加信息。使用docker inspect可查看鏡像的相關(guān)信息
LABEL maintainer="394498036@qq.com" LABEL version="1.0" LABEL description="This is description \ 歡迎關(guān)注:編程坑太多,我在等你."其實(shí)就類似咱們寫代碼的注釋,很多人寫代碼不愿意寫注釋,其實(shí)寫注釋對自己的負(fù)責(zé),過段時間翻坑的時候,想想當(dāng)初的意思,容易很快的解決,所以一定要寫LABEL
####RUN
構(gòu)建鏡像時執(zhí)行的命令
RUN yum update && yum install -y vim \ python-dev #反斜線換行 RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/* #注意清理cache RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'為了美觀,復(fù)雜的RUN請用反斜線換行,避免無用分層,合并多條命令成一行!
####WORKDIR
工作目錄
WORKDIR /test #如果沒有會自動創(chuàng)建test目錄 WORKDIR jianshu RUN pwd #輸出結(jié)果應(yīng)該是/test/jianshu用WORKDIR,不要用RUN cd 盡量使用絕對目錄!
####ADD and COPY
大部分情況,COPY優(yōu)于ADD,ADD除了COPY還有額外功能(解壓縮)!添加遠(yuǎn)程文件/目錄請使用curl 或者wget
####ENV
設(shè)置環(huán)境變量
ENV <key> <value> ENV <key>=<value> ... ENV MYSQL_VERSION 5.6 E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常亮盡量多使用,減少維護(hù)成本!
學(xué)習(xí)下面的先了解下
Shell 和Exec 格式
- Shell格式 RUN apt-get install -y vim CMD echo "hello docker 微信公眾號:編程坑太多" ENTRYPOINT echo "hello docker 微信公眾號:編程坑太多"
- Exec格式 RUN ["apt-get", "install", " -y", "vim"]
CMD ["/bin/echo","hello docker 微信公眾號:編程坑太多"]
ENTRYPOINT ["/bin/echo","hello docker 微信公眾號:編程坑太多"]
- Dockerfile1 FROM centos ENV name Docker ENTRYPOINT echo "hello $name"
- Dockerfile2 FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]
通過實(shí)際的例子查看區(qū)別。
mkdir cmd-entrrypoint cd cmd-entrrypoint/ vi Dockerfile - 先執(zhí)行Dockerfile1
- 先執(zhí)行Dockerfile2
我們通過shell格式運(yùn)行的話,它會通過默認(rèn)的bash里面通過shell執(zhí)行命令,它會通過shell替換這邊變量,通過exec格式運(yùn)行的話,只是單純的執(zhí)行echo,沒辦法幫我們替換到$name。如何解決不一樣的問題呢?請開始我的表演!修改Dockerfile2
FROM centos ENV name Docker ENTRYPOINT ["/bin/bash","-c", "echo hello $name"] docker build -t liming/centos-entrypoint-exec-new . docker run liming/centos-entrypoint-exec-new是不是很nice!
####CMD
設(shè)置容器啟動后默認(rèn)執(zhí)行的命令和參數(shù)
- 容器啟動時默認(rèn)執(zhí)行的命令
- 如果docker run 指定了其他命令,CMD命令被忽略
- 如何定義了多個CMD,只有最后一個會執(zhí)行
####ENTRTYPOINT
設(shè)置容器啟動時運(yùn)行的命令
- 讓容器以應(yīng)用程序或者服務(wù)的形式運(yùn)行
- 不會被忽略,一定會執(zhí)行
個人網(wǎng)站:IT人故事會 idig8.com
PS:Dockerfile詳解基本就介紹這么多,可能還有很多命令沒有講解,以后用到了在說吧。一定要CMD和ENTRTYPOINT因?yàn)楹芏喙俜降亩汲S眠@兩個命令。
往期精彩
轉(zhuǎn)載于:https://blog.51cto.com/12040702/2154833
總結(jié)
以上是生活随笔為你收集整理的『中级篇』Dockerfile详解(17)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: github的使用教程
- 下一篇: 快来加入阿里云大学【云学院】班级助理招募