主頁 >  其他 > docker Dockerfile里使用的命令說明

docker Dockerfile里使用的命令說明

2020-09-21 23:17:19 其他

一,dockerfile格式

  • 注釋#
  • 指令 引數
  • 指令不區分大小寫,但是推薦全部大寫指令,
  • 指令從上到下順序被執行
  • 第一個指令必須是【FROM】,指示出要使用的基礎鏡像,
  • 執行docker file時,如果使用到了別的組態檔,這些組態檔不能放到【執行docker file目錄】的父目錄,但可以放到子目錄,
  • 在執行docker file目錄下,可以放一個隱藏檔案(.dockerignore),里面存放的是build時不需要的檔案,可以使用通配符去指定,比如,某個子目錄里10個檔案,build時有3個檔案不需要,你在docker file里參考的是目錄名,所以這10個檔案都被引入進來了,但如果把不需要的3個檔案,加入到.dockerignore檔案里,build時就它們3個排除了,
  • 檔案名必須是:【Dockerfile】或者【dockerfile】

二,dockerfile 命令

目錄:

命令 簡要說明
FROM 指定基礎鏡像(base image)
MAINTAINER 不推薦使用,被LABLE替代了 , 用于讓dockerfile制作者提供本人的詳細資訊
LABEL 用于指定元資料,比如作者,檔案大小 等
COPY 復制宿主機里的檔案或目錄到:要build出的image的檔案系統的某個目錄里
ADD 類似COPY,比COPY多了支持壓縮類檔案的自動解壓和從URL下載
WORKDIR 用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定設定的作業目錄,
VOLUME 和run -v類似,但只能指定image里的某個目錄,而不能指定宿主機的目錄,
EXPOSE 和-p選項型別,指定容器要暴漏給外部的埠,但不能指定宿主機的埠
ENV 在容器的系統了定義環境變數,ENV,ADD,COPY等指令可以使用,
RUN 在build執行程序中,執行基礎鏡像里可以執行的任何shell命令
CMD 在docker build時不被運行,而是在docker run時運行,
ENTRYPOINT 類似CMD指令,用于為容器指定默認運行程式,
USER docker run,CMD,ENTRYPOINT執行的時候,所使用的用戶名或者UID
HEALTHCHECK 定期查看容器里運行的行程是否還在作業狀態
SHELL 指定用哪個shell去運行RUN
STOPSIGNAL 【docker stop 容器名】默認是個PID為1的行程發送15號信號
ARG 在build時,通過【--build-arg】傳入到dockerfile里面的變數
ONBUILD 當別人拿你做成的image作為base image,執行build時,ONBUILD命令才會執行,
  • FROM命令:repository為基礎鏡像(base image)的名稱,tag為base image的標簽,不指定就是latest,如果不指定registry,就從docker hub上拉取,

    • FROM <registry><repository>[:<tag>]

    • FROM <registry><repository>@<digest>

      當從外部registry拉image時,image有可能被別人替換了,但是repository名字相同,所以不安全,digest是image的hash值,所以指定了digest就不會被別人替換掉了,

  • MAINTAINER(不推薦使用,被LABLE替代了)命令:用于讓dockerfile制作者提供本人的詳細資訊,

    MAINTAINER可以出現在任何位置,但推薦放到FROM后面,

  • LABEL命令:用于指定元資料,比如作者,檔案大小等,

    • 用法:LABEL <key>=<value> <key>=<value> ...
  • COPY命令:復制宿主機里的檔案或目錄到:要build出的image的檔案系統的某個目錄里,

    • 語法:

      • COPY <src> ... <dest>
      • COPY ["<src>", ... "<dest>"]
        • src:源檔案或目錄,可以使用相對路徑(相對dockerfile所在的路徑),支持使用通配符
        • dest:目標路徑,建議絕對路徑,否則,COPY指定則以WORKDIR為起始路徑,
      • 注意:在路徑中有空白字符時,使用第二種格式,理由是空白字符是第一種格式的目錄分隔符,
    • 檔案復制準則:

      • src必須是dockerfile里面的檔案或目錄,不能是其父目錄中的檔案或路徑,

      • 如果src是目錄,則其內部檔案或子目錄都會被遞回復制,但src目錄自身不會被復制,

        相當于:cp src/* /dest,

      • 如果指定了多個src,或在src中使用了通配符,則dest必須是目錄,且必須以/結尾,

      • 如果dest事先不存在,它將會被自動創建,其父目錄也會被一并創建,

三,build特點:每執一行命令,都會新建一個層,層越多,性能越不好,所以能把命令放在一行,就盡量放在一行,

比如COPY命令,如果目標目錄相同,則最好只使用一次COPY,雖然使用多次COPY也不出錯誤,但是會多出層,性能不好,

docker build命令

獲取幫助資訊:

  • PATH:【Dockerfile】或者【dockerfile】檔案所在的目錄,
  • -c:制作程序使用多少CPU
  • -m:制作程序使用多少記憶體,
  • -t:指定image的repository和tag,
# docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable
                                unlimited swap
      --network string          Set the networking mode for the RUN instructions
                                during build (default "default")
      --no-cache                Do not use cache when building the image
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful
                                build (default true)
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

dockerfile 例子1:拷貝一個檔案,

FROM busybox:latest
MAINTAINER  "magedu <[email protected]>"
LABEL maintainer="magedu <[email protected]>"
COPY index.html /data/html/

build一下上面的dockerfile 試試,使用-t,來指定image的名字和tag,發現build成功了,

# docker build -t tinyhttpd:v0.01 ./
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM busybox:latest
 ---> b534869c81f0
Step 2/4 : MAINTAINER  "magedu <[email protected]>"
 ---> Using cache
 ---> 5c5a1c47716c
Step 3/4 : LABEL maintainer="magedu <[email protected]>"
 ---> Using cache
 ---> 88b87ddfdb22
Step 4/4 : COPY index.html /data/html/
 ---> Using cache
 ---> 59b7dd6c3eb8
Successfully built 59b7dd6c3eb8
Successfully tagged tinyhttpd:v0.01

啟動這個image,看看里面有沒有/data/html/index.html

# sudo docker run --name b1 --rm tinyhttpd:v0.01 cat /data/html/index.html
<h1>http server</h1>

dockerfile 例子2:拷貝一個目錄,

FROM busybox:latest
MAINTAINER  "magedu <[email protected]>"
LABEL maintainer="magedu <[email protected]>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/

執行build:

docker build -t tinyhttpd:v0.02 ./
Sending build context to Docker daemon  30.21kB
Step 1/5 : FROM busybox:latest
 ---> b534869c81f0
Step 2/5 : MAINTAINER  "magedu <[email protected]>"
 ---> Using cache
 ---> 5c5a1c47716c
Step 3/5 : LABEL maintainer="magedu <[email protected]>"
 ---> Using cache
 ---> 88b87ddfdb22
Step 4/5 : COPY index.html /data/html/
 ---> Using cache
 ---> 59b7dd6c3eb8
Step 5/5 : COPY yum.repos.d /etc/yum.repos.d/
 ---> 99d306a25cc7
Successfully built 99d306a25cc7
Successfully tagged tinyhttpd:v0.02

驗證:

docker run --name b1 -it --rm tinyhttpd:v0.02 ls /etc/yum.repos.d/
CentOS-Base.repo           CentOS-Sources.repo
CentOS-Base.repo_20191129  CentOS-Vault.repo
CentOS-CR.repo             CentOS-fasttrack.repo
CentOS-Debuginfo.repo      docker-ce.repo
CentOS-Media.repo          

二,dockerfile 命令(續)

  • ADD命令:類似COPY,比COPY多了支持壓縮類檔案的自動解壓和從URL下載

    • 語法:

      • ADD <src> ... <dest>
      • ADD ["<src>", ... "<dest>"]
    • ADD準則:

      • 同COPY指令
      • 如果src為URL且dest不以/結尾,則src指定的檔案將被下載并直接被創建為dest;如果dest以/結尾,則src指定的檔案將被下載并保存為dest/<filename>
      • 如果src是宿主機上的壓縮檔案,它將被自動展開,其行為類似tar -x;然而通過URL下載的壓縮檔案不會自動展開,
      • 如果src有多個,或使用了通配符,則dest必須是以/結尾的目錄路徑;如果dest不以/結尾,則其被視作一個普通檔案,src的內容將被直接寫入dest,
    • 例子1:使用URL

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      COPY index.html /data/html/
      COPY yum.repos.d /etc/yum.repos.d/
      ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src
      

      確認結果:

      # docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/
      nginx-1.2.9.tar.gz
      
      
    • 例子2:使用本地壓縮檔案

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      COPY index.html /data/html/
      COPY yum.repos.d /etc/yum.repos.d/
      #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
      ADD nginx-1.2.9.tar.gz /usr/local/src/
      

      確認結果:

      # docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/nginx-1.2.9
      CHANGES
      CHANGES.ru
      LICENSE
      README
      auto
      conf
      configure
      contrib
      html
      man
      src
      
  • WORKDIR命令:用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定設定的作業目錄,

    WORKDIR可以出現多次,這些命名去上面去找離它最近的WORKDIR作為相對路徑的起始,

    • 語法:

      • WORKDIR <PATH>
      • WORKDIR 系統環境變數(比如:$MYENV),
    • 例子:

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      COPY index.html /data/html/
      COPY yum.repos.d /etc/yum.repos.d/
      #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
      WORKDIR /usr/local/
      ADD nginx-1.2.9.tar.gz ./src1/
      

      確認結果:

      sudo docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src1/nginx-1.2.9
      [sudo] password for ys:
      CHANGES
      CHANGES.ru
      LICENSE
      README
      auto
      conf
      configure
      contrib
      html
      man
      src
      
  • VOLUME:和run -v類似,但只能指定image里的某個目錄,而不能指定宿主機的目錄,

    • 語法:

      • VOLUME <mountpoint>
      • VOLUME ["mountpoint1", "mountpoint2"]
    • 注意:如果image掛載點目錄下有檔案,則啟動容器后,會把掛載點下的檔案拷貝到宿主機,

    • 例子:

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      COPY index.html /data/html/
      COPY yum.repos.d /etc/yum.repos.d/
      #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
      WORKDIR /usr/local/
      ADD nginx-1.2.9.tar.gz ./src/
      VOLUME /usr/local/src
      

      確認結果:由于image的/usr/local/src目錄下有nginx-1.2.9,所以nginx-1.2.9會被拷貝到宿主機,

      # docker run --name b1 -it --rm tinyhttpd:v0.03
      # ls /var/lib/docker/volumes/1240925e87efaa5d9ed375b268a6d804c29013c04792f9a0dde9e135aa7e9f9e/_data/
      nginx-1.2.9
      
  • EXPOSE:和-p選項型別,指定容器要暴漏給外部的埠,但不能指定宿主機的埠,因為在作dockerfile的時候,無法確定此image運行在什么宿主機上,也就無法知道宿主機上哪些埠可以使用,所以是隨機去找宿主機里可以使用的埠,

    注意:即使使用了EXPOSE命令,但如果RUN時不加-P選項的話,埠也不會被暴露出去的,

    • 語法:EXPOSE <port>[/protocol] <port>[/protocol]

      • protocol是傳輸層協議,tcp或者udp,不知道就是tcp
      • 可以一次指定多個埠,比如:EXPOSE 5255 5254/udp
    • 例子:

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      COPY index.html /data/html/
      COPY yum.repos.d /etc/yum.repos.d/
      #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
      WORKDIR /usr/local/
      ADD nginx-1.2.9.tar.gz ./src/
      VOLUME /usr/local/src
      EXPOSE 80
      

      確認結果:

      啟動時先不指定-P,用docker port查看,發現沒有埠,

      # docker run --name b1 --rm tinyhttpd:v0.03 /bin/httpd -f -h /data/html/
      # docker port b1
      

      啟動時先指定-P,用docker port查看,發現有埠,

      # docker run --name b1 --rm -P tinyhttpd:v0.03 /bin/httpd -f -h /data/html/
      # docker port b1
      80/tcp -> 0.0.0.0:32768
      
    • EXPOSE的作用是:默認想暴露的埠,在啟動的時候,可以使用-p去覆寫EXPOSE指定的埠,

  • ENV:在容器的系統了定義環境變數,ENV,ADD,COPY等指令可以使用,

    • 語法:

      • ENV <key> <value>
      • ENV <key>=<value> ...
      • 第一種格式,<key>之后所以內容都被視作為value,只能定義一個變數,
      • 第二種格式,定義多個變數,如果value中包含空格,使用\進行轉義,也可以通過對value加引號進行標識;另外,\也用做換行,
      • 定義多個變數時,要使用第二種格式,以便不會增加額外的層,導致image過大,
    • 例子:${DOC_ROOT:-/data/html/}的用法是,if(DOC_ROOT 沒有值) {DOC_ROOT=/data/html/}

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      ENV DOC_ROOT=/data/html/ \
          WEB_SERVER_PACKAGE="/nginx-1.2.9"
      COPY index.html ${DOC_ROOT:-/data/html/}
      COPY yum.repos.d /etc/yum.repos.d/
      #ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
      WORKDIR /usr/local/
      ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
      VOLUME /usr/local/src
      EXPOSE 80
      
    • 延申,在docker run的時候也可以使用-e選項設定環境變數,

      在run的時候,通過-e,可以改變dockerfile里指定環境變數的值,

      dockerfile里定義的是nginx-1.2.9,但是-e指定的nginx-1.2.3,所以WEB_SERVER_PACKAGE=/nginx-1.2.3,

      # docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 printenv
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      HOSTNAME=7a242517b02e
      WEB_SERVER_PACKAGE=/nginx-1.2.3
      

      但是,/usr/local/src里的目錄還是nginx-1.2.9,因為在build的時點,image里放的就已經是nginx-1.2.9了,所以你在-e里,改變的只是環境變數的值而已,

      # docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 ls /usr/local/src
      nginx-1.2.9
      
      
  • RUN:在build執行程序中,執行基礎鏡像里可以執行的任何shell命令,如果是多個命令是有關聯的話,最好寫到一起,

    • 語法:

      • RUN <command>
      • RUN ["executable1","arg1","executable2","arg1"]
      • 例如:RUN ["/bin/bash","-c","ls","-ltr"]
    • 例子:我們指定ADD里的src如果是壓縮檔案的話,不會自動解壓縮,所以我們RUN一個tar命令去解壓縮它,

      FROM busybox:latest
      MAINTAINER  "magedu <[email protected]>"
      LABEL maintainer="magedu <[email protected]>"
      ENV DOC_ROOT=/data/html/ \
          WEB_SERVER_PACKAGE="nginx-1.2.9"
      COPY index.html ${DOC_ROOT:-/data/html/}
      COPY yum.repos.d /etc/yum.repos.d/
      ADD http://nginx.org/download/${WEB_SERVER_PACKAGE}.tar.gz /usr/local/src/
      RUN cd /usr/local/src && \
          tar xf ${WEB_SERVER_PACKAGE}.tar.gz
      
      
    • RUN用途舉例:先找個基礎的centos鏡像,然后裝一個nginx,一般都是下載源代碼編譯安裝,不是使用yum install,理由是yum會產生多余的檔案,

      FROM centos
      RUN yum -y install epel-release && \
          yum makecache && \
          yum install nginx
      
  • CMD:在docker build時不被運行,而是在docker run時運行,比如nginx鏡像啟動的時候,那么CMD肯定是啟動nginx的命令,所以CMD即使給了多個,只有最后一個生效,

    • 語法:

      • CMD <command>

        command通常是shell命令,而且是以/bin/sh -c來運行此命令,因此,是通過shell啟動的,所以可以使用shell的特性,而且啟動結束后,shell行程會自動推出,讓此行程代替shell行程,所以它pid是1,

      • CMD ["executable1","arg1","executable2","arg1"]

        executable是目錄名加上可執行程式名,比如/bin/ls,它不是通過/bin/sh -c來運行,是由內核直接啟動,由于不是由shell啟動,所以shell里的通配符,管道,重定向等特性,全部不能用,如果想用shell特性,可以這么使用:CMD ["/bin/bash","-c","executable","arg"].

      • RUN的第一種和第二種用法和CMD的第一種和第二種用法一樣,

      • CMD ["arg1","arg2"]

        配合ENTRYPOINT命令使用,

    • 例子:

      FROM busybox
      LABEL maintainer="mageedu <[email protected]>" app="httpd"
      
      ENV WEB_ROOT="/data/web/html/"
      
      RUN mkdir -p ${WEB_ROOT} && \
          echo '<h1>Busybox httpd.</h1>' > ${WEB_ROOT}/index.html
      
      CMD /bin/httpd -f -h ${WEB_ROOT}
      

      確認結果:用inspect確認,確實是用/bin/sh -c來啟動的,

      "Cmd": [
                      "/bin/sh",
                      "-c",
                      "/bin/httpd -f -h ${WEB_ROOT}"
                  ],
      

      pid也是1

       docker exec -it b1 /bin/sh
      / # ps
      PID   USER     TIME  COMMAND
          1 root      0:00 /bin/httpd -f -h /data/web/html/
          6 root      0:00 /bin/sh
         11 root      0:00 ps
       # printenv
      HOSTNAME=e877c51f7dab
      WEB_ROOT=/data/web/html/
      
      
  • ENTRYPOINT:

    • 類似CMD指令,用于為容器指定默認運行程式,

    • 與CMD不同的是,不會被docker run指定的引數覆寫(也有覆寫的辦法),而且docker run指定的引數,會自動加到ENTRYPOINT命令的后面,相當于ENTRYPOINT命令的引數了,

    • run時使用--entrypoint string選項,可以強制替換ENTRYPOINT命令,

    • 如果docker run時沒有指定引數,則使用上面CMD的第三種格式定義的引數,作為ENTRYPOINT的引數,

    • 如果docker run時指定了引數,CMD的第三種格式也指定了引數,ENTRYPOINT使用的是docker run時指定的引數,忽略CMD的第三種格式指定的引數,

    • dockerfile檔案種也可以出現多個ENTRYPOINT,但只有最后一個生效,

    • 語法:

      • ENTRYPOINT <command>
      • ENTRYPOINT ["executable", "param1", "param2"]
    • 例子:在build時創建nginx的組態檔,而且在run的時候,還可以通過-e引數傳遞環境變數,修改監聽的埠號等資訊,

      FROM nginx:alpine
      LABEL maintainer="MageEdu <[email protected]>"
      
      ENV NGX_DOC_ROOT="/data/web/html/"
      
      ADD entrypoint.sh /bin/
      ADD index.html ${NGX_DOC_ROOT}
      
      CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
      ENTRYPOINT ["/bin/entrypoint.sh"]
      

      ENTRYPOINT命令執行的是一個自己定義的shell命令檔案,內容如下,

      • 首先用cat命令創建了一個nginx的組態檔,還使用了環境變數,

      • 然后,呼叫exec系統函式,引數是CMD定義的命令:["/usr/sbin/nginx", "-g", "daemon off;"],exec函式的作用是:啟動ngxin行程,并終止當前行程(/bin/sh行程),讓nginx行程取代當前的shell行程,所以nginx行程的pid是1,

        "$@":shell的全部引數,也就是/usr/sbin/nginx", "-g", "daemon off;

      entrypoint.sh:

      #!/bin/sh
      
      cat > /etc/nginx/conf.d/www.conf << EOF
      server {
        server_name $HOSTNAME;
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGX_DOC_ROOT:-/usr/share/nginx/html};
      }
      EOF
      
      exec "$@"
      

      當run的時候,執行ENTRYPOINT命令,引數是CMD里定義的,

      確認結果:通過-e把監聽埠設定成了8080;nginx的pid是1;www.conf也被創建了,在宿主機器上執行【curl -H "Host: a6b94dae9be4" 192.0.0.2:8080】,也輸出了index.html的結果,

      # docker run --name b1 --rm -d -e "PORT=8080" mynignx:002
      # docker exec -it b1 /bin/sh
      / # netstat -tnl
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
      tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
      # cat /etc/nginx/conf.d/www.conf
      server {
        server_name a6b94dae9be4;
        listen 0.0.0.0:8080;
        root /data/web/html/;
      }
      / # ps
      PID   USER     TIME  COMMAND
          1 root      0:00 nginx: master process /usr/sbin/nginx -g daemon off;
          8 nginx     0:00 nginx: worker process
      # cat /data/web/html/index.html
      <h1>nginx hello</h1>
      $ curl -H "Host: a6b94dae9be4" 192.0.0.2:8080
      <h1>nginx hello</h1>
      
      

      試驗一下,在run時,指定引數:/usr/sbin/nginx daemon off(故意不加-g),去覆寫CMD,因為缺少了-g,所以容器啟動失敗,說明了,確實覆寫CMD里定義的命令,

      # docker run --name b1 --rm -d -e "PORT=8080" mynignx:002 /usr/sbin/nginx daemon off
      4c88e021408c143ec45e70611c42bd715831cb9c75d6f4a00d307a7a6b53af5c
      [root@localhost ~]# docker ps
      CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
      
      
      

      試驗一下,使用--entrypoint "/bin/sh",覆寫ENTRYPOINT,

      覆寫成功了,1號行程是/bin/sh行程;www.conf檔案沒有被創建;nginx行程沒有被啟動,

      # docker run --name b1 --rm -it -e "PORT=8080" --entrypoint "/bin/sh" mynignx:002
      / # ls
      bin    dev    home   media  opt    root   sbin   sys    usr
      data   etc    lib    mnt    proc   run    srv    tmp    var
      / # ps
      PID   USER     TIME  COMMAND
          1 root      0:00 /bin/sh
          7 root      0:00 ps
      / # ls /etc/nginx/conf.d/
      default.conf
      
    • ENTRYPOINT用法的最佳實踐:build之前事先創建好組態檔,build時,注入到image了,就能達到動態創建各種服務的組態檔,從而解決了只是因為組態檔的不同,而不得不創建多個image的問題,

  • USER

    • 使用USER的背景,不指定USER的時候,行程的所有者都是root,比如下面的nginx,當不希望是root的時候,使用此命令,

      / # ps
      PID   USER     TIME  COMMAND
          1 root      0:00 nginx: master process nginx -g daemon off;
      
    • docker run,CMD,ENTRYPOINT執行的時候,所使用的用戶名或者UID

    • 默認情況下是root

    • 語法:USER <UID> | <UserName>

      UID或者UserName必須是在image里存在的,必須存在于/etc/passwd中,

  • HEALTHCHECK:

    • 定期查看容器里運行的行程是否還在作業狀態,docker自己會自動檢查容器里的行程是否還活著,如果死了或者不在前臺運行的時候,docker會自動殺死這個容器,但這是不夠的,有的容器即使活著,但不能提供服務了,那也相當于死了,所以要自己定義一個命令去檢查容器里運行的行程,是否還在作業,

    • 語法:

      • HEALTHCHECK [OPTION] CMD command
        • OPTION:
          • --interval=:檢查的間隔(默認:30秒)
          • --timeout=:定義超時時長(默認:30秒)
          • --start-period=:等多久開始第一次健康檢查(默認:0秒)
          • --retries=:發現不健康了,不是立即殺死容器,而要再試驗幾次,再試驗的次數(默認:3次),
        • 健康檢查結果:
          • 0:success
          • 1:unhealthy
          • 2:reserved(保留,為使用)
      • HEALTHCHECK NONE
    • 例子:健康檢查結果是正常的,

      FROM nginx:alpine
      LABEL maintainer="MageEdu <[email protected]>"
      
      ENV NGX_DOC_ROOT="/data/web/html/"
      
      ADD entrypoint.sh /bin/
      ADD index.html ${NGX_DOC_ROOT}
      
      HEALTHCHECK  --interval=3s --timeout=3s \
         CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
      
      CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
      ENTRYPOINT ["/bin/entrypoint.sh"]
      

      結果確認:

      # docker run --name b1 --rm  mynginx:v001
      127.0.0.1 - - [08/Dec/2019:13:54:18 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
      127.0.0.1 - - [08/Dec/2019:13:54:21 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
      127.0.0.1 - - [08/Dec/2019:13:54:25 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
      
    • 例子:健康檢查結果是不正常的,發現不正常后,直接【kill 1】,容器啟動后,馬上就被殺死了,

      FROM nginx:alpine
      LABEL maintainer="MageEdu <[email protected]>"
      
      ENV NGX_DOC_ROOT="/data/web/html/"
      
      ADD entrypoint.sh /bin/
      ADD index.html ${NGX_DOC_ROOT}
      
      HEALTHCHECK  --interval=1s --timeout=1s  --retries=1 \
         CMD wget -O - -q http://${IP:-0.0.0.0}:10080/ || kill 1
      
      CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
      ENTRYPOINT ["/bin/entrypoint.sh"]
      
      
  • SHELL:指定用哪個shell去運行RUN,CMD,ENTRYPOINT的命令,默認是/bin/sh -c,

    • 語法:SHELL ["executable", "parameters"]
    • 可以出現多次,每次都會覆寫上一次,
  • STOPSIGNAL:【docker stop 容器名】默認是個PID為1的行程發送15號信號,STOPSIGNAL可以指定別的信號,

    • 語法:STOPSIGNAL 信號,
  • ARG:

    • 在build時,通過【--build-arg】傳入到dockerfile里面的變數

    • dockerfile里可以有多個ARG

    • 語法: ARG <name>[=<default value>]

    • 可以在dockerfile里定有ARG的默認值

      ARG version=1.14

    • 例子:

      FROM nginx:alpine
      ARG author="MageEdu <[email protected]>"
      LABEL maintainer=${author}
      
      
      
      

      確認結果:build時,沒有使用--build-arg

      # docker build -t mynginx:v002 ./
      # docker image inspect mynginx:v002
      "Labels": {
                      "maintainer": "MageEdu <[email protected]>"
                  },
      

      確認結果:build時,使用--build-arg

      # docker build --build-arg author="abc <[email protected]>" -t mynginx:v002 ./
      # docker image inspect mynginx:v002
      "Labels": {
                      "maintainer": "abc <[email protected]>"
                  },
      
      
  • ONBUILD

    • build時不執行此命令,
    • 當別人拿你做成的image作為base image,執行build時,ONBUILD命令才會執行,
    • 語法:ONBUILD 任何dockerfile命令(除了FROM和MAINTAINER)
    • ONBUILD ADD或者ONBUILD COPY要格外小心,因為你不知道別人在拿你的image做base image時,檔案都放在哪里,ADD如果是遠程要下載的檔案是沒有問題的,

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/100337.html

標籤:其他

上一篇:百度都有哪些開源專案呢?本文推薦一下。

下一篇:清除Windows系統圖示快取

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more