Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
>[info]减少分层,缩小镜像体积。
使用.dockerignore
## 构建镜像
~~~
docker build [选项] <上下文路径/URL/->
~~~
### 参数
~~~
-t,--tag
打标签
~~~
## 构建上下文
构建时会将上下文的内容传到docker的服务端,需要使用的文件也需要放到这个上下文中。
## FROM 指定存在的基础镜像
~~~
FROM <image> 或者
FROM <image>:<tag>
~~~
## MAINTAINER 指定作者和联系信息
~~~
MAINTAINER <name>
比如:MAINTAINER hiyang echohiyang@foxmail.com
~~~
## RUN 镜像构建过程中需要执行的指令
~~~
shell模式
RUN <command> 默认使用`/bin/sh -c `执行命令
RUN yum install -y httpd
exec模式
RUN ["executable", "param1", "param2"]
RUN ["/bin/bash", "-c", "echo hello"]
~~~
## CMD 指定容器运行时的默认行为
若运行时指定指令,则会被覆盖
~~~
CMD ["executable", "param1", "param2"]
CMD command param1 param2
~~~
RUN和CMD看起来挺像,但是,CMD用来指定容器启动时用到的命令,只能有一条。当docker run时指定运行命令,将不会执行
## ENTRYPOINT 格式类似CMD
容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。
CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT的参数可以被--entrypoint覆盖;会比CMD或者docker run指定的命令要靠前执行。
## EXPOSE
~~~
EXPOSE <port> [<port>...]
EXPOSE 22 80 8443
~~~
这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口映射出去。
## ENV
它主要是为后续的RUN指令提供一个环境变量;在构建过程和运行过程中同样有效
~~~
ENV <key> <value>, 比如
ENV PATH /usr/local/mysql/bin:$PATH
ENV MYSQL_version 5.6
~~~
## COPY 复制
~~~
COPY <源路径>... <目标路径>
~~~
构建上下文目录中 **<源路径>** 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 ,<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
>[danger]使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。
## ADD 高级复制
~~~
ADD <src> <dest>
~~~
提供了tar功能
将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url(不推荐使用)。
## VOLUME
~~~
VOLUME ["/data"]
~~~
创建一个可以从本地主机或其他容器挂载的挂载点。
## USER 默认使用root用户
~~~
USER daemon
~~~
执行 RUN , CMD 以及ENTRYPOINT 这类命令的身份
## WORKDIR
~~~
WORKDIR /path/to/workdir
~~~
需使用绝对路径
## ONBUILD
镜像触发器,当镜像为用作其他镜像的基础镜像时会执行
会在构建过程中插入指令
## HEALTHCHECK
选项
~~~
--interval=<间隔>
两次健康检查的间隔,默认为 30 秒;
--timeout=<时长>
健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数>
当连续失败指定次数后,则将容器状态视为unhealthy ,默认 3 次
~~~
### 测试用
~~~
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib
/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
~~~
## docker build -t centos:base -f /soft/docker/Dockerfile /soft
~~~
docker build -t myweb:v1 .
docker run -d --name web -p 80:80 myweb:v1
docker inspect --format '{{json .State.Health}}' web | python -m json.tool
~~~
[dockerfile最佳实践][]
[1]:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/