docker-dockerfile
阿新 • • 發佈:2018-12-10
之前簡單說過一些,現在來個正式一點的
註釋
# 老規矩,註釋嘛,這個就是
# 前面這個開頭的就是註釋了
# 發現c++的註釋好亮,以後就用這個了
FROM
# from必須是dockerfile非註釋的第一行
# 指定基礎映象
FROM ubuntu:14.04
MAINTIANER
# maintainer 就是作者資訊啦
MAINTAINER author "email"
RUN
# 這個就值得一說了 # 執行時機 # 1. 這個命令在基礎映象準備完畢之後,就會執行了 # 重複 # 2. 這個命令可以重複使用,指定多條指令 # 3. 模式 # 3.1 bash命令,採用bash -c執行 RUN apt-get update # 3.1.1 多命令合併&& RUN apt-get update && apt-get install -y ping # 3.2 陣列命令,採用exec執行 RUN ["apt-get","install","-y","ping"] # 作用 # 基本上一個基礎映象上的改造都集中到這,採用RUN進行寫入 # 一般情況下映象準備好之後就是它執行了,不一般的情況就是後面的ONBUILD命令了
CMD
# 不是我說,這老哥有點苦逼 # 1. 概念 # 和RUN一樣,也是指令 # 2. 執行時機 # 2.1 這個在構建時是不執行的,只有在建立容器時才執行這個命令 # 2.2 如果執行時指定了命令,可憐的老哥也會被覆蓋 # 3. 執行模式 # 3.1 同RUN,支援bash模式 CMD apt-get update # 3.2 也可以陣列 CMD ["apt-get","update"] # 4. 引數模式 CMD ["update"] # 4.1 好吧,都不能運行了,只是為後面的ENTRYPOINT傳引數了 # 4.2 作為命令,是預設的,有命令了就會被覆蓋,作為引數,傳入引數了還是被覆蓋,唉~~~ # 老哥辛苦
ENTRYPPOINT
# 建立容器 docker run -p 80 -i -t -d --name contain_name image_name command args # 一般啟動時候就是這樣了,通過image_name分為兩半 # 1. 執行模式 # 2. 執行命令 # 如果啟動命令中只有前半段 docker run -p 80 -i -t --name contain_name image_name # 恭喜CMD苦逼老哥,這個時候就是他執行的時候了 # 如果是全命令的話 docker run -p 80 -i -t -d --name contain_name image_name command args # CMD老哥也是悶死在棺材板裡了,出不來了 # ENTRYPOINT就不一樣了 docker run -it --entrypoint contain_name image_name # 只要指定--entrypoint就可以得到執行 # 哪怕是 docker run -it --entrypoint contain_name image_name command args # entrypoint也會執行 # 鞭屍CMD docker run -it --entrypoint contain)name image_name -g args # 當不指定command,只傳入引數args時,entrypoint會執行,CMD老哥引數被覆蓋 # 哪怕淪落到只帶引數也出不來,被覆蓋啊被覆蓋 # CMD不帶命令的引數模式,只有通過陣列模式能傳過來 # 同樣的entrypoint也必須是陣列模式
ADD
ADD SRC DEST
# 其實就是個拷貝命令,從指定位置拷貝到容器指定目錄
# 新增,細數一下特點吧
# 1. 支援系統檔案,支援正則,支援相對路徑
# 和一般檔案操作一樣吧
# 2. 支援解壓
# 拷貝tar等壓縮檔案,自動解壓
# 3. 支援http連線地址
# 就這樣了
COPY
# 和ADD重了啊
# 1. 支援系統檔案,相對路徑,正則
# 2. 不支援解壓
# 3. 不支援http
# 專而精吧,人家docker官方都說了拷貝系統檔案就用它了(推薦)
VOLUNE
# 恩。。。。和卷相關的,什麼持久化之類的,暫時駕馭不住,不說
ENV
# 設定環境變數
# 1. 配置方式
ENV key value
ENV key=value
# 兩種方式隨便用
# 配置多個無所謂
# 2. 生命週期
# 不論是構建還是執行,都能用
# 3. 使用場景
# 3.1 指令中可以直接使用,不論是構建時的RUN,還是執行時的CMD
# 3.2 執行的容器也會帶這個環境變數,直接用也可以
USER
# 不論構建還是執行,總需要執行命令
# 執行命令也總需要角色
# 拋開構建,執行時就歸它管理了,這個就是指定執行命令是的使用者角色
USER user
USER uid
USER user:group
USER uid:group
USER uid:gid
# 隨便怎麼玩啦
# 但是不配置的時候,預設是用root進行操作的
ONBUILD
# 知道你盜版人家軟體的時候是怎麼被知道的麼
# 也不加鎖,就等你盜,然後告你
ONBUILD curl http://www.godme.com
# 然後記錄訪問次數就差不多了
# 之前說了一般基礎映象準備好後執行RUN指令(ENV載入不算指令執行)
# 不一般的就是這個ONBUILD
# 如果把一個配置了ONBUILD的映象作為基礎映象,準備映象之後,就會觸發這個基礎映象的ONBUILD
# 如果你想防盜,或者破壞,就在ONBUILD掛木馬吧
# 使用是沒有問題的,如果有人想把你的映象作為基礎映象再建立的話........
# 世界太可怕了
LABEL
# 這個嘛, 就是個標記
LABEL key value
# 和ENV一樣,只是單單是資訊記錄而已,不影響
EXPOSE
# 這個之前說過了,就是宣告一下容器埠使用
EXPOSE 80
# 也可以同時宣告多個,空格隔開即可
EXPOSE 80 81 82 83
# 慢慢來,也不是不可以
EXPOSE 80
EXPOSE 81
EXPOSE 82
# 只是,宣告並不是最重要的,這個資訊也僅僅是作為了記錄資訊儲存了而已
# 啟動時還是需要進行埠對映的
docker run -p 80 contain_name command args
# 但是如果採用自動對映,它就會自動取查詢資訊並隨機對映
docker run -P contain_name command args
# 一般保險還是-p手動對映比較好,-P不推薦使用
# 但EXPOSE還是不能不寫的,萬一哪天忘記了到哪查去,浪費功夫了就
WORKDIR
# 這個也比較好理解,就是執行時指令的執行目錄
# linux的都知道
# 1. 一般採用絕對路徑進行指定
# 2. 相對路徑會向下傳遞
WORKDIR a
WORKDIR b
WORKDIR c
# 最終WORKDIR:a/b/c
# 騷就行了,使用的時候還是絕對路徑比較好