0%

Dockerfile理解使用

docker file 包含一系列命令行,docker通过该文件组织生成镜像,一个docker file文件主要包括四部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

以一个dockerfile为例:

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大

基本的命令内容

  1. FORM:指定基础镜像,必须为第一个命令

    1
    2
    3
    4
    5
    6
         # 格式:
    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
      # 例如:
      FROM node:alpine

    同一个镜像可能有不同大小版本,不同的tag表示基于不同的base image(以python3.9.6 镜像为例)

    1. 完整版

    2. alpine 基于alpine linux的docker镜像,特点就是容量小,适合作为基础镜像

      Alpine 是众多 Linux 发行版中的一员,和 CentOS、Ubuntu、Archlinux之类一样,只是一个发行版的名字,号称小巧安全,有自己的包管理工具 apk

    3. Debian Buster 基于Debian linux的docker镜像

    4. slim 即瘦身版本,删去了部分通用包支持

      • python:slim-buster是大多数Python用例的良好基础镜像
  2. RUN: 构建镜像是执行的命令(支持两种执行方式)

    1
    2
    3
    4
    5
    6
    # shell执行
    # 格式:
    RUN <command>
    # exec执行
    # 格式:
    RUN ["command", "param1", "param2"]
  3. ADD/COPY:将本地文件添加到docker镜像中

    1
    2
    3
    ADD <src> <dest>
    # 例如:
    COPY . /data
  4. WORKDIR:切换工作目录,即容器启动后的pwd,当前目录

    1
    2
    3
    4
    # 格式:
    WORKDIR path
    # 例如:
    WORKDIR . /data
  5. CMD: 在容器启动后执行相关命令

    1
    2
    3
    # 格式:
    CMD ["executable","param1","param2"]
    CMD command param1 param2
    • 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

    参数名和参数值相连,分别为列表中的两个不同项,以gunicorn为例

    1
    gunicorn MainWebApp:app -c gunicorn.conf.py -t 100

    等价于

    1
    CMD ["gunicorn", "MainWebApp:app", "-c", "gunicorn.conf.py", ""-t", "100"]

    列表中的参数和命令一定要使用双引号