DockerFile 创建镜像

105 阅读2分钟

什么是Dockerfile

参考: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