Dockerfile(上)

如果沒有dockerfile文件,那麼我們新建一個容器的時,需要講基礎鏡像運行起來,然後進入容器中,進行相應的改造,然後在commit這個容器,使用dockerfile,這個過程可以自動的完成。
dockerfile文件需要有一個專門的目錄,構建時會讀取該目錄下的所有文件,所以這個目錄下應該放的是我們需要的文件,可以包含子目錄,如果有.dockerignore文件,這個文件的內容就是互虐文件夾下的什麼文件,可以使用通配符,一半來說Dockerfile,第一個“D”應該大寫。

FROM

FROM是必須有的一個指令,並且必須是第一個非註釋行,用於指定base鏡像,後續的操作都是基於這個base鏡像的。可以使用兩種,第一種是指定sha256的值,這樣鏡像就是唯一的,第二種就是指定標籤,不過第一種更安全,第二種意思更加明確。

FROM busybox@b534869c81f05ce6fbbdd3a3293e64fd032e059ab4b28a0e0d5b485cf904be4b
FROM busybox:latest
MAINTAINER

在低版本的docker中,一般指定鏡像的作者,是一個可選指令。

MAINTAINER "oyd [email protected]"
LABEL

指定鏡像的元數據,是一個可選參數,數據都是key-value型的,可以指定多個

LABEL email="[email protected]" time="1214"
COPY

用於從Docker宿主機向鏡像中複製文件

  • COPY <src> … <dest>
  • COPY ["<src>",…"<dest>"]
    src:要複製的源文件或者目錄,支持通配符,使用相對路徑,只能是Dockerfile所在文件夾之內的文件。
    dest:目標路徑,也就是文件複製進去後所放的位置,一般都是絕對路徑
    注意事項
  • 如果src是目錄,那麼其中的文件會被遞歸複製,但是src目錄本身不會被複制
  • 如果指定了多個src ,或者src中使用了通配符,但是dest必須是一個目錄,必須是以"/"結尾
  • dest如果事先不存在,他會被自動創建,包括多級目錄。
COPY index.html /data/web/html/
[root@node7 myfile]# docker build  ./ -t  web:0.1
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM busybox:latest
 ---> b534869c81f0
Step 2/3 : LABEL email="[email protected]" time="1214"
 ---> Running in e35dc9ef85c7
Removing intermediate container e35dc9ef85c7
 ---> 241af9e3bfc5
Step 3/3 : COPY index.html /data/web/html/
 ---> 1cd6a50a96f1
Successfully built 1cd6a50a96f1
Successfully tagged web:0.1
[root@node7 myfile]# docker run --rm web:0.1 cat /data/web/html/index.html
hello busybox
ADD

ADD和copy類似,ADD支持TAR和URL

  • ADD <src>…<dest>
  • ADD ["<src>"…"<dest>"]
    如果src是一個URL而且dest不以“/”結尾,那麼指定的文件會被下載下來並且被直接被創建爲;如果src以/結尾,那麼文件會被下載下來保存到該文件夾下面
    如果src是一個本地的系統上的壓縮文件,他就會被當作一個目錄解壓,通過URL獲取的文件不會自動解壓。
    如果src有多個,那麼dest就必須以/結尾,如果只有一個src,dest不以/結尾,那麼dest會被當作文件寫入src的內容。
ADD http://nginx.org/download/nginx-1.17.6.tar.gz /usr/local/
[root@node7 myfile]# docker run --rm web:0.2 ls /usr/local/
nginx-1.17.6.tar.gz
ADD nginx-1.17.6.tar.gz /usr/local/
[root@node7 myfile]# docker run --rm web:0.3 ls /usr/local/
nginx-1.17.6
[root@node7 myfile]# docker run --rm web:0.3 ls /usr/local/nginx-1.17.6
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
WORKDIR

指定從當前指定起到下一個workdir的工作目錄

WORKDIR /usr/local/
ADD nginx-1.17.6.tar.gz ./ 
[root@node7 myfile]# docker build  ./ -t  web:0.4
Sending build context to Docker daemon  1.041MB
Step 1/3 : FROM busybox:latest
 ---> b534869c81f0
Step 2/3 : WORKDIR /usr/local/
 ---> Running in c654b1172f9b
Removing intermediate container c654b1172f9b
 ---> 24edc2481b1e
Step 3/3 : ADD nginx-1.17.6.tar.gz ./
 ---> adc12f0b7b6c
Successfully built adc12f0b7b6c
Successfully tagged web:0.4
[root@node7 myfile]# docker run --rm web:0.4 ls /usr/local/nginx-1.17.6
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
VOLUME

指定一個掛載點,會掛載到宿主機上去。相當於指定了一個V

VOLUME /data/web/html/
        "Mounts": [
            {
                "Type": "volume",
                "Name": "54db7463158fab066064185c005d633281aedaef75ee73e3dd9d0ee7b4675115",
                "Source": "/var/lib/docker/volumes/54db7463158fab066064185c005d633281aedaef75ee73e3dd9d0ee7b4675115/_data",
                "Destination": "/data/web/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
EXPOSE

指定容器需要暴漏的端口,RUN的時候需要使用-P纔會暴漏出來。

EXPOSE 80/tcp 22/ssh
[root@node7 myfile]# docker run -d --rm  --name web -P web:0.6 sleep 60
21c83393296536b3b2ec811e0af6003b4ba236427a9fe4c61d0ec16d902c2e17
[root@node7 myfile]# docker port web
22/tcp -> 0.0.0.0:32769
80/tcp -> 0.0.0.0:32768
ENV

bulid時可以使用變量,並且支持默認參數

ENV WEB=nginx-1.17.6.tar.gz 
ADD ${WEB:-nginx-1.17.6.tar.gz} ${DEST:-/usr/local/}
[root@node7 myfile]# docker run  --rm web:0.7 ls /usr/local/  ##變量生效
nginx-1.17.6
[root@node7 myfile]# docker run  --rm web:0.7 printenv  ##運行爲容器時也在
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=c2e0d0ce13d4
WEB=nginx-1.17.6.tar.gz
HOME=/root
[root@node7 myfile]# docker run -e WEB=nginx-1.17.7.tar.gz --rm web:0.7 printenv  ##會被run的時候覆蓋
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e8edb78dc485
WEB=nginx-1.17.7.tar.gz
HOME=/root
RUN

在build過程中執行的一些命令

RUN mkdir -p /data/web/html/ && \
    echo 'hello buxsybox' > data/web/html/index.html
[root@node7 myfile]# docker run  --rm web:0.8 cat /data/web/html/index.html
hello buxsybox
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章