一、什麼是Dockerfile
Dockerfile是建立自定義Docker鏡像的描述檔案,我們可以在Dockerfile中寫出一條條指令來控制鏡像需要執行什麼操作,下面具體講講Dockerfile中的指令。
二、Dockerfile四大功能分區
1. 基礎鏡像
聲明自定義鏡像的基礎鏡像
FROM centos
2. 描述資訊
此處可以聲明鏡像的負責人、版本、建構時間、描述等一系列資訊,此處可以聲明任何資訊
LABEL [email protected]
LABEL version="1.0"
LABEL date="2020/03/08"
LABEL description="RPM軟體包制作"
3. 安裝鏡像執行指令
3.1 USER
執行Dockerfile中shell指令時指定的使用者,包括:RUN、CMD、ENTRYPOINT
USER <user>[:<usergroup>]
USER root
3.2 EXPOSE
指定容器運作時的服務端口
EXPOSE 80 443
3.3 WORKDIR
為Dockerfile中執行的指令設定工作目錄,包括:ADD、COPY、RUN、CMD、ENTRYPOINT
WORKDIR /root
3.4 ADD
拷貝檔案/目錄到鏡像中
ADD <src>...<dest>
ADD rpmbuild.tar.gz /root/
ADD https://xxx.com/rpmbuild.tar.gz /root/
3.5 COPY
拷貝檔案/目錄到鏡像中,用法與ADD相同,但是不支援自動下載下傳和解壓
ADD /home/mysql_cron /etc/cron.d/
3.6 VOLUME
把主機的目錄挂載到docker中,類似nfs檔案共享,一般很少用,大多在
docker run中用-v來進行挂載
VOLUME ["/usr/local/"]
3.7 ARG
在建構鏡像時指定的參數
ARG user
USER $user
隻需要在
docker build時帶上user參數即可
docker build --build-arg user=root -f dockerfile_rpmbuild .
3.8 RUN
建構鏡像時運作的指令
RUN ["yum", "install", "net-tools", "-y"]
RUN yum install net-tools -y
3.9 ENV
設定目前系統内環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_231
3.10 HEALTHCHECK
檢查容器是否在仍在工作
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
CMD curl -f http:/localhost/ || exit 1
-
選項說明:
--interval=DURATION (default: 30s):每隔多長時間探測一次,預設30秒
-- timeout= DURATION (default: 30s):服務響應逾時時長,預設30秒
--start-period= DURATION (default: 0s):服務啟動多久後開始探測,預設0秒
--retries=N (default: 3):認為檢測失敗幾次為當機,預設3次
-
傳回值說明:
0:容器成功是健康的,随時可以使用
1:不健康的容器無法正常工作
2:保留不使用此退出代碼
4. 容器啟動執行指令
4.1 CMD方式
可以編輯多條,每條指令按順序執行。
CMD ["-C", "/start.sh"]
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
4.2 ENTRYPOINT方式
同CMD類似,但這種方式執行的指令不會被
執行的參數所覆寫,同時
執行的參數會傳到此方式執行的腳本中。
ENTRYPOINT [ "rpmbuild", "-bb" , "/root/rpmbuild/SPEC/mysql-install.spec"]
ENTRYPOINT [ "dpkg", "-b", "mysql-install", "mysql-install.deb"]
重要提示:ENTRYPOINT可以有多行,但是執行時隻有最後一行生效,切記!
三、Dockerfile執行個體
# 基礎鏡像
FROM centos
# 描述資訊
LABEL [email protected]
LABEL version="1.0"
LABEL date="2020/03/08"
LABEL description="RPM軟體包制作"
# 安裝鏡像執行指令
WORKDIR /root
USER root
RUN rpm -ivh net-tools-2.0-0.51.20160912git.el8.x86_64.rpm
RUN yum install rpm-build-4.14.2-25.el8.x86_64 -y
# 啟動容器執行指令
ENTRYPOINT [ "rpmbuild", "-bb", "rpmbuild/SPEC/*.spec"]