Docker学习笔记 - Dockerfile

April . 26 . 2021

什么是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


持续更新中......