Dockerfile是docker的配置文件,用户可以通过它快速的构建镜像。
context
docker build
可以通过Dockerfile构建镜像,构建的上下文是文件的位置(PATH或URL)。
上下文是可以迭代运行的,因此PATH
可以包含子路径,URL
可以包含子模块。
以当前目录构建镜像
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
构建过程是通过Docker daemon运行,而不是CLI,因此构建的第一个过程是将全部的context发送给daemon.
最佳实践:将Dockerfile置于空目录,然后在该目录中添加需要的文件.
警告:不要经/作为构建路径
通过context,Dockerfile中的命令可以引用需要的文件。
同时,为了提高运行效率,可以添加.dockerignore
文件,排除不需要的文件与目录。
Dockerfile
通常,Dockerfile
就取名为Dockerfile
,但是也可以通过-f
指定。
$ docker build -f /path/to/a/Dockerfile .
tag
可以在构建镜像时,指定repository与tag
$ docker build -t shykes/myapp .
如果需要为多个repository标记镜像,可以添加多个-t
参数
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
syntax validation
在Docker daemon运行Dockerfile中命令之前,它会执行检验,返回语法错误
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
运行
Docker daemon会逐行执行Dockerfile
中的命令,并将每个指令的执行结果提交给新镜像(如果必要)。最后,输出新镜像的ID。
Docker daemon会自动清空发送的context。由于,每个指令都是单独运行的,并可能创建新的镜像。因此,RUN cd /tmp
不会对接下来的命令有影响。
Docker会重复使用中间层镜像,从而加速docker build,这可以从控制台输出看到using cache
$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
---> 31f630c65071
Step 2/4 : MAINTAINER [email protected]
---> Using cache
---> 2a1c91448f5f
Step 3/4 : RUN apk update && apk add socat && rm -r /var/cache/
---> Using cache
---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
---> Using cache
---> 7ea8aef582cc
Successfully built 7ea8aef582cc
【参考】
1。docker:dockerfile:https://docs.docker.com/engine/reference/builder/\#usage