1. 程式人生 > 其它 >【容斥原理+狀壓DP】[CQOI2012]-區域性極小值

【容斥原理+狀壓DP】[CQOI2012]-區域性極小值

目錄

今日內容概述

Dockerfile構建映象

今日內容詳細

Dockerfile構建映象

Dockerfile由一行行命令語句組成,並且支援以#開頭的註釋行。一般來說,Dockerfile主體內容分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行的指令。

Docker以從上到下的順序執行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個宣告以#字元開頭則被視為註釋。可以在Docker檔案中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

下面我們來看看具體的指令

FROM:指定基礎映象,必須為第一個命令

FROM 指定基礎映象,目的是為了給構建映象提供一個基礎環境
# 格式:
FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:  FROM mysql:5.7
注:  tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎映象

MAINTAINER::維護者資訊

指定維護者資訊	# 沒什麼好說的

RUN:構建映象時執行的命令

基於FROM指定的docker映象執行一個指令,將結果反映到新生成的映象。RUN指令後面執行的命令必須是映象中已經存在了的命令。
# RUN有兩種命令執行的方式
shell執行:
格式:
    RUN <command>
exec執行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:  RUN指令建立的中間映象會被快取,並會在下次構建中使用。如果不想使用這些快取映象,可以在構建時指定--no-cache引數,如:docker build --no-cache

CMD:構建容器後呼叫(在容器啟動時才進行呼叫)

CMD指令用於指定一個容器啟動時要執行的命令,這有點類似於RUN指令,只是RUN指令是指定映象被構建時要執行的命令;而CMD是指定容器被啟動時要執行的命令。這和使用docker run 命令時指定要執行的命令非常類似
# CDM可以為要執行的命令指定引數
CMD ["/bin/bash,"-l"]	這裡將-l標誌傳遞給了/bin/bash命令

CMD指令也有兩種格式:
exec格式		
["nginx", "-g", "daemon off;"]
			
shell格式
nginx -g 'daemon off;'

# 需要注意的是,要執行的命令是存放在一個數組結構中的,這將告訴Docker按指定的樣子來執行該命令,當然也可以不使用陣列指定CMD指令,這時候Docker會在指定的命令前加上/bin/sh -c。這在執行該命令的時候可能會導致意料之外的行為,所以Docker推薦使用陣列語法來設定要執行的命令。

最後一點,使用docker run 命令可以覆蓋CMD指令,如果我們在Dockerfile裡指定了CMD指令,而同時在docker run 命令中也指定了要執行的命令,命令列中指定的命令會覆蓋Dockerfile中的CMD指令。

在Dockerfile中只能指定一條CMD指令,如果指定了多條CMD指令,也只有最後一條CMD指令會被使用。

ENTRYPOINT

ENTRYPOINT指令與CMD指令非常類似,也很容易和CMD指令弄混,它們有什麼區別呢?
我們已經知道,docker run 命令列會覆蓋CMD指令,但有時我們希望容器按我們希望的方式去工作,那麼CMD就不夠合適。
而ENTRYPOINT指令提供的命令不容易在啟動容器時被覆蓋,實際上docker run 命令列中指定的任何引數都會被當做引數再次傳遞給ENTRYPOINT指令中指定的命令。
例子:
ENTRYPOINT ["/usr/sbin/nginx"]
類似於CMD指令,我們也可以在該指令中通過陣列的方式為命令列指定相應的引數
ENTRYPOINT ["/usr/sbin/nginx,"-g","daemon off;"]

# 如果ENTRYPOINT和CMD指令同時存在,則CMD的相關內容會被設定成ENTRYPOINT的引數

ADD和COPY

ADD : 將本地檔案新增到映象
    ADD支援自動解壓,但是僅僅支援解壓tar包
    ADD支援遠端下載,但是不會解壓網路資源
示例:
ADD hom* /mydir/          # 新增所有以"hom"開頭的檔案
    ADD hom?.txt /mydir/      # ? 替代一個單字元,例如:"home.txt"
    ADD test relativeDir/     # 新增 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 新增 "test" 到 /absoluteDir/
    
# ADD指令會使得構建快取變得無效,這一點非常重要,如果通過ADD指令向映象新增一個檔案過目錄,那麼將使Dockerfile中的後續指令都不能繼續使用之間的構建快取。

COPY : 將檔案複製到映象
語法:COPY < src>… < dest>|[“< src>”,… “< dest>”]
指令邏輯與ADD十分相似,同樣Docker Daemon會從編譯目錄尋找檔案或目錄,dest為映象中的絕對路徑或者相對於WORKDIR的路徑

WORKDIR

WORKDIR用來從映象建立一個新容器時,在容器內部設定一個工作目錄,ENTRYPOINT或/CMD指定的程式會在這個目錄下執行

我們可以使用該指令為Dockerfile中後續到的一系列指令設定工作目錄,也可以為最終的容器設定工作目錄
例項:
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
# 這裡我們將工作目錄切換為/opt/webapp/db後運行了bundle install命令,之後又將工作目錄設定為/opt/webapp,最後設定了ENTRYPOINT指令來啟動rackup命令

可以通過-w標誌在執行時覆蓋工作目錄
docker run -it -w /var/log ubuntu pwd /var/log
該命令會將容器內的工作目錄設定為/var/log

ENV:設定環境變數

設定一個容器的環境變數
格式:
    ENV <key> <value>  #<key>之後的所有內容均會被視為其<value>的組成部分,因此,一次只能設定一個變數
    ENV <key>=<value> ...  #可以設定多個變數,每個變數為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用於續行
示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy

新的環境變數可以在後續的任何RUN指令中使用;也可以使用docker run 命令列的-e引數來傳遞變數,這些變數只會在執行時有效。

USER

USER指令用來指定該映象會以什麼樣的使用者去執行
示例:
USER www
基於該映象啟動的容器會以www使用者的身份來執行,我們可以指定使用者名稱或UID以及組或GID,甚至是兩者的組合
USER www
USER www:group
USER www:gid

我們也可以在docker run 命令中通過-u選項來覆蓋該指令指定的值

# 如果不通過USER指令指定使用者,預設使用者為root

VOLUME:用於持久化目錄

VOLUME指令用來向基於映象建立的容器添加捲,一個卷是可以存在與一個或者多個容器內的特定的目錄,這個目錄可以繞過聯合檔案系統,並提供如下共享資料或者對資料進行持久化的功能。
1.卷可以在容器內共享和複用
2.一個容器可以不是必須和其他容器共享卷
3.對卷的修改不會對更新映象產生影響
4.卷會一直儲存直到沒有任何容器再使用它。

卷功能讓我們可以將資料(程式碼)、資料庫或者其他內容新增到映象中而不是將這些內容提交到映象中,並且允許我們在多個容器間共享這些內容。

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

ARG:用於指定傳遞給構建執行時的變數

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www

ONBUILD:用於設定映象觸發器

ONBUILD指令能為映象新增觸發器(triggger),當一個映象被用作其他映象的基礎映象時,該映象中的觸發器將會被執行。
觸發器會在構建過程中插入新的指令,我們可以認為這些指令是緊跟在FROM之後指定的,觸發器可以是任何構建指令。

# 觸發器,ONBUILD後面跟指令,在構建時不會執行,只有在當前映象作為基礎映象構建時才會執行。

格式:  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src

EXPOSE:指定於外界互動的埠

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080    
    EXPOSE 11211/tcp 11211/udp
注:  
        EXPOSE並不會讓容器的埠訪問到主機。要使其可訪問,需要在docker run執行容器時通過-p來發布這些埠,或通過-P引數來發布EXPOSE匯出所有的埠

LABEL:用於為映象新增元資料

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="這是一個Web伺服器" by="IT筆錄"
注:
  使用LABEL指定元資料時,一條LABEL指定可以指定一或多條元資料,指定多條元資料時不同元資料之間通過空格分隔。推薦將所有的元資料通過一條LABEL指令指定,以免生成過多的中間映象。

構建映象

1.Dockerfile
Dockerfile命名必須D大寫其他必須小寫
Dockerfile中所有的指令必須大寫
2.構建映象的命令
docker build -t 映象名稱 
引數:
-t : 指定構建映象的名稱