docker file intro

Docker 2 -- 關於Dockerfile

08 May 2014

Dockerfile是一個鏡像的表示,可以通過Dockerfile來描述構建鏡像的步驟,並自動構建一個容器

所有的 Dockerfile 命令格式都是:

INSTRUCTION arguments

雖然指令忽略大小寫,但是建議使用大寫

FROM 命令

FROM <image>

FROM <image>:<tag>

這個設置基本的鏡像,爲後續的命令使用,所以應該作爲Dockerfile的第一條指令。

比如:

FROM ubuntu

如果沒有指定 tag ,則默認tag是latest,如果都沒有則會報錯。

RUN 命令

RUN命令會在上面FROM指定的鏡像裏執行任何命令,然後提交(commit)結果,提交的鏡像會在後面繼續用到。

兩種格式:

RUN <command> (the command is run in a shell - `/bin/sh -c`)

或:

RUN ["executable", "param1", "param2" ... ]  (exec form)

RUN命令等價於:

docker run image command
docker commit container_id

註釋

使用 # 作爲註釋

如:

# Memcached
#
# VERSION       1.0

# use the ubuntu base image provided by dotCloud
FROM ubuntu

# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

# install memcached
RUN apt-get install -y memcached

MAINTAINER 命令

MAINTAINER <name>

MAINTAINER命令用來指定維護者的姓名和聯繫方式

如:

MAINTAINER Guillaume J. Charmes, [email protected]

ENTRYPOINT 命令

有兩種語法格式,一種就是上面的(shell方式):

ENTRYPOINT cmd param1 param2 ...

第二種是 exec 格式:

ENTRYPOINT ["cmd", "param1", "param2"...]

如:

ENTRYPOINT ["echo", "Whale you be my container"]

ENTRYPOINT 命令設置在容器啓動時執行命令

root@tankywoo-docker:~# cat Dockerfile
FROM ubuntu
ENTRYPOINT echo "Welcome!"

root@tankywoo-docker:~# docker run 62fda5e450d5
Welcome!

USER 命令

比如指定 memcached 的運行用戶,可以使用上面的 ENTRYPOINT 來實現:

ENTRYPOINT ["memcached", "-u", "daemon"]

更好的方式是:

ENTRYPOINT ["memcached"]
USER daemon

EXPOSE 命令

EXPOSE 命令可以設置一個端口在運行的鏡像中暴露在外

EXPOSE <port> [<port>...]

比如memcached使用端口 11211,可以把這個端口暴露在外,這樣容器外可以看到這個端口並與其通信。

EXPOSE 11211

一個完整的例子:

# Memcached
#
# VERSION       2.2

# use the ubuntu base image provided by dotCloud
FROM ubuntu

MAINTAINER Victor Coisne [email protected]

# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

# install memcached
RUN apt-get install -y memcached

# Launch memcached when launching the container
ENTRYPOINT ["memcached"]

# run memcached as the daemon user
USER daemon

# expose memcached port
EXPOSE 11211

上面是官方例子,國內建議換成163或sohu的源,不然太慢了。

root@tankywoo-docker:~# docker build -t tankywoo  - < dck                       [38/480]
Uploading context  2.56 kB
Uploading context
Step 0 : FROM ubuntu
 ---> 99ec81b80c55
Step 1 : MAINTAINER Victor Coisne [email protected]
 ---> Using cache
 ---> 2b58110877f6
Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
 ---> Running in f55a4a8bb069
 ---> d48c6a965398
Step 3 : RUN apt-get update
 ---> Running in da091a1dd6e7
Ign http://mirrors.163.com precise InRelease
Get:1 http://mirrors.163.com precise Release.gpg [198 B]

....

Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for ureadahead (0.100.0-16) ...
 ---> 2886671b5b86
Step 5 : ENTRYPOINT ["memcached"]
 ---> Running in e8aeeab92cb6
 ---> 7148293a4053
Step 6 : USER daemon
 ---> Running in 288766b19606
 ---> 235e7f630ffa
Step 7 : EXPOSE 11211
 ---> Running in c6f881b9d51f
 ---> 666c5d65f396
Successfully built 666c5d65f396
Removing intermediate container f55a4a8bb069
Removing intermediate container da091a1dd6e7
Removing intermediate container f23631d3d45a
Removing intermediate container e8aeeab92cb6
Removing intermediate container 288766b19606
Removing intermediate container c6f881b9d51f

ENV 命令

用於設置環境變量

ENV <key> <value>

設置了後,後續的RUN命令都可以使用

使用此dockerfile生成的image新建container,可以通過 docker inspect 看到這個環境變量:

root@tankywoo-docker:~# docker inspect 49bfc7a9817f
    ...
    "Env": [
        "name=tanky",
        "HOME=/",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    ...

裏面的name=tanky就是設置的。

也可以通過在docker run時設置或修改環境變量:

docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash

ADD 命令

從src複製文件到container的dest路徑:

ADD <src> <dest>
  • <src> 是相對被構建的源目錄的相對路徑,可以是文件或目錄的路徑,也可以是一個遠程的文件url
  • <dest> 是container中的絕對路徑

VOLUME 命令

VOLUME ["<mountpoint>"]

如:

VOLUME ["/data"]

創建一個掛載點用於共享目錄

具體參考 Docker 4 -- 總結

WORKDIR 命令

WORKDIR /path/to/workdir

配置RUNCMDENTRYPOINT 命令設置當前工作路徑

可以設置多次,如果是相對路徑,則相對前一個 WORKDIR 命令

比如:

WORKDIR /a WORKDIR b WORKDIR c RUN pwd

其實是在 /a/b/c 下執行 pwd

CMD 命令

有三種格式:

  • CMD ["executable","param1","param2"] (like an exec, preferred form)
  • CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  • CMD command param1 param2 (as a shell)

一個Dockerfile裏只能有一個CMD,如果有多個,只有最後一個生效。

The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT as well.

TODO 還沒搞清楚這個的作用

ONBUILD

TODO

總結一下,基本常用的命令是: FROMMAINTAINERRUNENTRYPOINTUSERPORTADD

一些例子

參考


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章