什么是Dockerfile
Dockerfile是构件镜像的文本文件,文本内包含构建的一条一条的指令。 Dockerfile每执行一个指令,都会再Docker新建一层。过多无意思的层会导致镜像过大 例如:
FROM centos\
RUN yum -y install wget\
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"\
RUN tar -xvf redis.tar.gz
改成:
FROM centos\
RUN yum -y install wget \\
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \\
&& tar -xvf redis.tar.gz
使用
docker build -f /path/to/a/Dockerfile -t shykes/myapp .
-f : 指定自定义的 Dockerfile 文件,默认找 Dockerfile。 -t : 输出镜像名称
指令说明
- FROM
构建镜像基于哪个镜像
- MAINTAINER
镜像维护者姓名或邮箱地址
- RUN
构建镜像时运行的指令
- CMD
运行容器时执行的shell环境 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
- VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器
- USER
为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
- WORKDIR
为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
- HEALTHCHECH
健康检查
- ARG
构建时指定的一些参数.与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
- EXPOSE
声明容器的服务端口(仅仅是声明)
- ENV
设置容器环境变量
- ADD
拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
- COPY
拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
- ENTRYPOINT
运行容器时执行的shell命令
CMD 和 ENTRYPOINT 的区别
测试1 :DockerFile文件:
FROM centos
CMD ["ls","-a"]
docker build -f test-cmd-dockerfile -t test-cmd .
docker run test-cmd
docker run test-cmd -l
测试2: DockerFile 文件:
FROM centos
ENTRYPOINT ["ls","-a"]
docker build -f test-entrypoint-dockerfile -t test-entrypoint .
docker run test-entrypoint
docker run test-entrypoint -l