Dockerfile 就是一个描述镜像具体组成的具体文件,可以根据这个文件构建镜像。
FROM:指定基础镜像
FROM centos:7
MAINTAINER:镜像维护信息
MAINTAINER Benjamin Yang <133xxxx2282@163.com>
RUN:执行命令
RUN ["yum", "install", "httpd"]RUN yum install httpd
COPY:复制文本
COPY ... COPY ["",... ""] 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则,如:COPY *.txt /workdir/ COPY hom?.txt /mydir/使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
ADD:高级复制文件
ADD jdk-8u45-linux-x64.tar.gz / 可以是一个 URL ,下载后的文件权限自动设置为 600 。
CMD:容器启动命令
shell 格式:CMD
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
CMD nginx -g "daemon off;"
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT:入口点
同 CMD,指定容器启动程序及参数。
通过--entrypoint 参数在运行时替换。
启动容器时执行的 Shell 命令,同 CMD 类似,只是由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT 指定指定的程序,例如:
PS:Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效。
示例:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
追加-i参数
$ docker run myip -i
......
当前 IP:61.148.226.66 来自:北京市 联通
ENV:设置环境变量
在其他指令中可以直接引用 ENV 设置的环境变量。
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
ARG:构建参数
与 ENV 不同的是,容器运行时不会存在这些环境变量。
可以用 docker build --build-arg = 来覆盖。
FROM centos:6
ARG user # ARG user=root
USER $user
这时,我们在 docker build 时可以带上自定义参数 user了,如下所示:
docker build --build-arg user=benjaminYang Dockerfile .
VOLUME:定义匿名卷
VOLUME ["/var/lib/mysql"]
PS:一般不会在 Dockerfile 中用到,更常见的还是在 docker run 的时候指定 -v 数据卷。
EXPOSE:暴露端口
声明容器运行的服务端口,例如:
EXPOSE 80 443
WORKDIR:指定工作目录
为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录,例如:
WORKDIR /data
USER:指定当前用户
这个用户必须是事先建立好的,否则无法切换。
USER
HEALTHCHECK:健康检查
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \ CMD curl -f http:/localhost/ || exit 1
其中,一些选项的说明:
--interval=DURATION (default: 30s):每隔多长时间探测一次,默认30秒
-- timeout= DURATION (default: 30s):服务响应超时时长,默认30秒
--start-period= DURATION (default: 0s):服务启动多久后开始探测,默认0秒
--retries=N (default: 3):认为检测失败几次为宕机,默认3次
一些返回值的说明: