Dockerfile 基本結構 Dockerfile 是一個文本格式的配置文件,用戶可以使用 Dockerfile 快速創建自定義鏡像。 Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。 Docker分為四部分: 基礎鏡像信息 維護者信息 鏡像操作指令 容器啟動時預設要執行 ...
Dockerfile
目錄基本結構
Dockerfile 是一個文本格式的配置文件,用戶可以使用 Dockerfile 快速創建自定義鏡像。
Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。
Docker分為四部分:
- 基礎鏡像信息
- 維護者信息
- 鏡像操作指令
- 容器啟動時預設要執行的指令
指令
FROM
格式為FROM <image>
或FROM <image>:<tag>
。
第一條指令必須為FROM指令。並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個FROM指令(每個鏡像一次)。
示例
#語法:
FROM <鏡像名稱>
LABEL MAINTAINER
指定維護者信息
#語法:
LABEL MAINTAINER "[作者] [郵箱]"
ENV
設置環境變數,定義了環境變數,那麼在後續的指令中,就可以使用這個環境變數
#語法:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG
構建參數,與 ENV 作用一致。不過作用域不一樣。ARG 設置的環境變數僅對 Dockerfile 內有效,也就是說只有 docker build 的過程中有效,構建好的鏡像內不存在此環境變數。
#語法:
ARG <參數名>[=<預設值>]
RUN
用於執行後面跟著的命令行命令。有以下倆種格式:
shell格式
#語法:
RUN <命令行的命令>
RUN ["/bin/bash","-c","echo hello"]
exec格式
#語法:
RUN ["可執行文件", "參數1", "參數2"]
RUN echo "hello world\nhello tom" > /tmp/abc && \
cat /tmp/abc
CMD
- CMD 在docker run 時運行。
- RUN 是在 docker build。
- 作用:為啟動的容器指定預設要運行的程式,程式運行結束,容器也就結束。CMD 指令指定的程式可被 docker run 命令行參數中指定要運行的程式所覆蓋。
註意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。
#語法:
CMD <shell 命令>
CMD ["<可執行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程式提供預設參數
ENTRYPONT
類似於 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程式。
但是, 如果運行 docker run 時使用了 --entrypoint 選項,將覆蓋 ENTRYPOINT 指令指定的程式。
優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運行所需的參數
註意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
#語法:
ENTRYPOINT <shell 命令>
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
WORKDIR
WORKDIR : 指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創建好的)。
docker build 構建鏡像過程中的,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 創建的目錄才會一直存在。
#語法:
WORKDIR <工作目錄路徑>
COPY
複製指令,從上下文目錄中複製文件或者目錄到容器里指定路徑。
#語法:
COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
ADD
ADD :ADD 指令和 COPY 的使用格類似(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
ADD 的優點:在執行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會自動複製並解壓到 <目標路徑>;並且源文件目錄可以是URL
ADD 的缺點:在不解壓的前提下,無法複製 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
#語法:
ADD <src> <dest>
VOLUME
定義匿名數據捲。在啟動容器時忘記掛載數據捲,會自動掛載到匿名捲
#語法:
VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>
EXPOSE
EXPOSE用於告訴Docker伺服器容器暴露的埠號,供互聯繫統使用
#語法:
EXPOSE 埠號
USER
指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。
當服務不需要管理員許可權時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶
#語法:
USER <用戶名>[:<用戶組>]
ONBUILD
配置當所創建的鏡像作為其他鏡像的基礎鏡像時,所執行的操作指令。
#語法:
ONBUILD <其它指令>
使用Dokcerfile製作鏡像
先創建一個目錄用於存放軟體包和dockerfile
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
[root@localhost apache]# mkdir files
[root@localhost apache]# touch Dockerfile
[root@localhost apache]# ls
Dockerfile files
[root@localhost apache]# cd files/
[root@localhost files]# wget http://mirrors.aliyun.com/apache/apr/apr-1.7.0.tar.gz https://mirrors.aliyun.com/apache/apr/apr-util-1.6.1.tar.gz https://mirrors.aliyun.com/apache/httpd/httpd-2.4.54.tar.gz
[root@localhost files]# ls
apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.54.tar.gz
編寫一個entrypoint.sh的腳本
[root@localhost apache]# cd files/
[root@localhost files]# vim entrypoint.sh
#!/bin/bash
sed -i '/^ServerName/s/#//g' /usr/local/apache/conf/httpd/conf
exec "$@"
[root@localhost files]# chmod +x entrypoint.sh
[root@localhost files]# ll
total 11136
-rw-r--r--. 1 root root 1093896 Apr 5 2019 apr-1.7.0.tar.gz
-rw-r--r--. 1 root root 554301 Oct 23 2017 apr-util-1.6.1.tar.gz
-rwxr-xr-x. 1 root root 87 Aug 30 20:51 entrypoint.sh
-rw-r--r--. 1 root root 9743277 Jun 8 16:42 httpd-2.4.54.tar.gz
編寫Dockerfile
[root@localhost files]# cd ..
[root@localhost apache]# vim Dockerfile
FROM centos
LABEL MANTAINER "zxr [email protected]"
ENV apr_version=1.7.0 apr_util_version=1.6.1 httpd_version=2.4.54
ADD files/* /usr/src/
ADD files/entrypoint.sh /
RUN rm -rf /etc/yum.repos.d/* && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
yum -y install make gcc gcc-c++ openssl-devel pcre-devel expat-devel libtool libxml2-devel && \
useradd -r -M -s /sbin/nologin apache && \
cd /usr/src/apr-${apr_version} && \
sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && make && make install && \
cd /usr/src/apr-util-${apr_util_version} && \
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
make && make install && \
cd /usr/src/httpd-${httpd_version} && \
./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork && make && make install && \
yum clean all && \
yum -y remove gcc gcc-c++ make && \
rm -rf /tmp/* /usr/src/*
WORKDIR /usr/local/apache
EXPOSE 80
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
創建鏡像
[root@localhost ~]# podman build -t xinruizhong/httpd:v1 apache/
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/xinruizhong/httpd v1 31de2ac7a44b About an hour ago 417 MB
quay.io/centos/centos latest 300e315adb2f 21 months ago 217 MB
創建容器進行測試
[root@localhost ~]# podman run -d -p 80:80 xinruizhong/httpd:v1
a3be623f7ba0d7145515538d5be1273b5e22ea838ffd81a1adf8739d576e2cdd
[root@localhost ~]# curl 127.0.0.1:80
<html><body><h1>It works!</h1></body></html>