[TOC]
## dockerfile
### 構建鏡像:docker build -f /path/Dockerfile
dockerfile:https://blog.csdn.net/m0_46090675/article/details/121846718
https://www.jianshu.com/p/11265192400a
>Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),用于構建鏡像。每一條指令構建一層鏡像,因此每一條指令的內容,就是描述該層鏡像應當如何構建。
>完整鏡像結構圖

### 命令解析
#### FROM
>指定基礎鏡像,必須為第一個命令
~~~
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像
~~~
#### RUN
>構建鏡像時執行的命令
~~~
RUN用于在構建鏡像時執行命令,其有以下兩種命令執行方式:
shell執行
格式:
RUN <command>
exec執行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令創建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像,
可以在構建時指定--no-cache參數,如:docker build --no-cache
~~~
#### ADD
>將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget
~~~
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路徑
示例:
ADD hom* /mydir/ # 添加所有以"hom"開頭的文件
ADD hom?.txt /mydir/ # ? 替代一個單字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
~~~
#### COPY
>功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源
~~~
# 復制單個文件
COPY data01.txt /home/data/
# 復制多個文件,根據通配符匹配
COPY data*.txt /home/data/
# 復制文件夾
COPY temp/data/ /home/data/
~~~
#### CMD
>構建鏡像后調用,也就是在容器啟動時才進行調用。
~~~
格式:
CMD ["executable","param1","param2"] (執行可執行文件,優先)
CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數)
CMD command param1 param2 (執行shell內部命令)
示例:
CMD echo "This is a test." | wc -l
CMD ["/usr/bin/wc","--help"]
注:CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令
~~~
#### ENTRYPOINT
>配置容器,使其可執行化。配合CMD可省去"application",只使用參數。指定容器啟動時執行的命令
~~~
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先)
ENTRYPOINT command param1 param2 (shell內部命令)
示例:
FROM ubuntu
ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"]
之后,docker run 傳遞的參數,都會先覆蓋cmd,然后由cmd 傳遞給entrypoint ,做到靈活應用
注:ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,
而docker run命令中指定的任何參數,都會被當做參數再次傳遞給CMD。
Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,
而只執行最后的ENTRYPOINT指令。
通常情況下, ENTRYPOINT 與CMD一起使用,ENTRYPOINT 寫默認命令,當需要參數時候 使用CMD傳參
~~~
#### LABEL
>用于為鏡像添加元數據
~~~
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="這是一個Web服務器" by="IT筆錄"
注:
使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據
之間通過空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。
~~~
#### ENV
>設置環境變量
~~~
格式:
ENV <key> <value> #<key>之后的所有內容均會被視為其<value>的組成部分,因此,一次只能設置一個變量
ENV <key>=<value> ... #可以設置多個變量,每個變量為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用于續行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
~~~
#### EXPOSE
>指定于外界交互的端口
~~~
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口
如果沒有暴露端口,后期也可以通過-p 8080:80方式映射端口,但是不能通過-P形式映射
~~~
#### VOLUME
>用于指定持久化目錄(指定此目錄可以被掛載出去)
~~~
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,并具有以下功能:
1 卷可以容器間共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后會立即生效
4 對卷的修改不會對鏡像產生影響
5 卷會一直存在,直到沒有任何容器在使用它
~~~
#### WORKDIR
>工作目錄,類似于cd命令
~~~
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a)
WORKDIR b (這時工作目錄為/a/b)
WORKDIR c (這時工作目錄為/a/b/c)
注:
通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY
等命令都會在該目錄下執行。在使用docker run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。
~~~
#### USER
>指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶
~~~
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。
鏡像構建完成后,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。
~~~
#### ARG
>設置鏡像構建參數。與*ENV*指令作用一致,不過作用域不一樣:ARG 設置的環境變量僅對*Dockerfile*內有效,也就是說只有`docker build`的過程中才有效,構建好的鏡像內不存在此環境變量。
* 構建命令`docker build`中可以用`--build-arg <key>=<value>`來覆蓋。
~~~
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
~~~

#### ONBUILD
>配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令。
~~~
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
~~~
當新的*Dockerfile*中基于鏡像*myImage*(*即使用`FROM myImage`*)時,會自動執行*ONBUILD*指令的內容,等價于在后面添加了兩條指令:
~~~
FROM myImage
# 自動運行以下兩條指令
ADD . /app/src
RUN /usr/local/bin/python-build –dir /app/src
~~~
### 制作鏡像的注意事項
* 如果有多個RUN,自上而下依次運行,每次運行都會形成新的層,建議&& 放入一行運行
* 如果有多個CMD,只有最后一個運行
* 如果有多個Entrypoint,只有最后一個運行
* 如果CMD和entrypoint共存,只有entrypoint運行,且最后的CMD會當做entrypoint的參數
>鏡像制作分為兩個階段
* docker build階段 基于dockerfile制作鏡像 (RUN,用于此階段的運行命令)
* docker run階段 基于鏡像運行容器 (CMD,基于image run容器時候,需要運行的命令)
* docker build 基于第一階段的鏡像被別人from制作新鏡像 (entrypoint 或onbuild 基于鏡像重新構建新鏡像時候在此階段運行的命令)
#### 完整的dockerfile示列
~~~
# This my first nginx Dockerfile
# Version 1.0
# Base images 基礎鏡像
FROM centos
#MAINTAINER 維護者信息
MAINTAINER bertwu
#ENV 設置環境變量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在當前目錄下,拷過去會自動解壓
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 執行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相當于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 運行以下命令
CMD ["nginx"]
~~~
eg:
~~~
FROM centos:7
MAINTAINER bertwu <1258398543@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD /bin/bash
~~~
逐行解釋該Dockerfile文件的指令:
FROM centos:7 該image文件繼承官方的centos7
ENV MYPATH /usr/local:設置環境變量MYPATH
WORKDIR $MYPATH:直接使用上面設置的環境變量,指定/usr/local為工作目錄
RUN yum -y install vim && net-tools:在/usr/local目錄下,運行yum -y install vim和yum -y install net-tools命令安裝工具,注意安裝后的所有依賴和工具都會打包到image文件中
EXPOSE 80:將容器80端口暴露出來,允許外部連接這個端口
CMD:指定容器啟動的時候運行命令
>查看鏡像構建過程:docker history 鏡像id
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker