什么是Dockerfile ?
Dockerfile 是一个用来构建镜像的文本文件, 文本内容包含了一条条构建镜像所需的指令和说明。
语法梳理与最佳实践
1. FROM
指定制作镜像的 base image 是什么.
FROM scratch # 制作base image
FROM centos # 使用base image
FROM ubuntu:18.04
尽量使用官方的 image 作为 base image !
2. LABEL
作用类似于注释, 用作描述镜像的维护者, 版本或说明.
LABEL maintainer="xxxxx@gmail.com"
LABEL version="1.0.0"
LABEL description="This is description"
LABEL 信息不可少 !
3. RUN
用于执行后面跟着的命令, 命令格式分为 shell 格式与 exec 格式.
RUN apt-get update && apt-get install -y vim \ # '\' 换行符
python-dev # shell 格式
RUN ["/usr/bin/bash", "-c", "echo hello"] # exec 格式
避免无用分层, 合并多条命令成一行 !
复杂的RUN用反斜杠换行 !
4. WORKDIR
设定当前工作目录.
WORKDIR /test # 如果当前根目录没有 test 目录则会自动创建
WORKDIR demo
RUN pwd # 输出结果应该是 /test/demo
推荐使用 WORKDIR 而非 RUN cd !
尽量使用绝对目录 !
5. ADD and COPY
将本地目录的文件添加到 Docker 镜像中.
ADD hello.txt / # 将本地根目录下的 hello.txt 添加到镜像的 '/' 目录中
ADD test.tar.gz / # 将本地根目录下的 test.tar.gz 添加到镜像的 '/' 目录中并解压, 使用 COPY 不会解压
COPY test.tar.gz / # COPY 不会解压
通常情况下推荐优先使用 COPY !
ADD 有额外的解压缩功能 !
添加远程文件/目录请使用 curl 或者 wget !
6. ENV
设置环境变量作为常量.
ENV MYSQL_VERSION 8.0 # 设置常量
RUN apt-get install -y mysql-server = "${MYSQL_VERSION}" # 引用常量
尽量使用ENV来增加可维护性 !
7. CMD
设置容器启动后默认执行的命令和参数.
FROM centos
ENV name Docker # 定义常量
CMD echo "hello $name" # 使用常量
如果 docker run 指定了其它命令, CMD 命令会被忽略 !
如果定义了多个 CMD, 只有最后一个会执行 !
7. ENTRYPOINT
设置容器启动时运行的命令.
FROM centos
COPY test.sh /usr/local/bin/ # 拷贝 SHELL脚本
ENTRYPOINT ["test.sh"] # 执行 SHELL 脚本
不会被忽略, 一定会执行 !
写一个SHELL 脚本并通过 ENTRYPOINT 执行 !
参考资料
官方 Docker 镜像大全: https://github.com/docker-library/docs
Dockerfile 语法教程: https://www.runoob.com/docker/docker-dockerfile.html
持续更新中......