Docker 笔记(5) Dockerfile

0. 前言

1. 通过 Dockerfile 构建镜像

  • 前置条件:准备好 Dockerfile(具体构建可参考第二章)。
  • 构建镜像,其实就是通过 Dockerfile 中的命令以及 context 来构建
    • 所谓 context 指的是一系列由PATH/URL指定的文件(目录中的文件)
  • Dockerfile 每一行都会创建一个中间过程镜像
    • 如果命令太多那就会占用很多资源。
    • 默认不会删除中间镜像,要删除的话需要手动删除。
    • 有中间过程镜像后,如果创建出错,修改后,就能在出错的位置继续执行build命令。
  • docker build 详解
    • 官方文档
    • 命令形式:docker build [OPTIONS] PATH | URL | -
      • PATH 和 URL 不是 Dockerfile 的路径,而是 Dockerfile 所在目录的路径。
    • 常用选项:
      • -f:指定Dockerfile的路径
      • --rm:设置镜像成功后删除中间容器
      • -m:设置最大内存
      • -t, --tag:指定镜像的名称以及标签,格式是 name:tagname
  • 使用举例
# 使用当前目录下的 Dockerfile 创建镜像
docker build .

# 使用 url 构建镜像
# 会先 clone 整个repo作为context,再构建
docker build github.com/creack/docker-firefox

# 指定本地 Dockerfile
docker build -f Dockerfile.debug .

# 使用远程 Dockerfile
curl example.com/remote/Dockerfile | docker build -f - .

2. 如何构建 Dockerfile

  • 基本命令格式:INSTRUCTION arguments
  • 主要命令包括:
    • FROM:基础镜像,必须作为Dockerfile的第一句(注解除外)
      • FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
    • RUN:docker build 命令时执行的命令
      • RUN <command>RUN ["executable", "param1", "param2"]
    • CMD:类似于 RUN,在docker run时执行的命令
      • CMD command param1 param2CMD ["executable","param1","param2"]
    • LABEL:为镜像添加元数据
      • LABEL <key>=<value> <key>=<value> <key>=<value> ...,key与value都可通过引号引用
    • EXPOSE:声明端口(不会发布端口,只是提醒host,container会在这个端口发布信息)
      • EXPOSE <port> [<port>/<protocol>...]
    • ENV:定义环境变量,后续指令中都能使用
      • ENV <key>=<value> ...
    • ADD:从context目录中赋值文件到容器内目录,会自动解压压缩包到目标目录
      • ADD [--chown=<user>:<group>] <src>... <dest>ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
    • COPY:与ADD类似,不会自动解压压缩包
    • ENTRYPOINT:类似于CMD,但没详细了解细节
    • VOLUME:定义匿名数据卷(指定容器内目录)
      • VOLUME ["<路径1>", "<路径2>"...]VOLUME PATH
    • USER:切换执行命令的用户、用户组
      • USER <user>[:<group>]USER <UID>[:<GID>]
    • WORKDIR:改变当前工作路径,即改变 pwd 的位置
      • WORKDIR /path/to/workdir
    • ARG:设置构建参数,与ENV类似,但作用域仅限于当前Dockerfile
      • ARG <name>[=<default value>]

3. Tips

  • 建议将多个RUN指令合并为一个,减少中间镜像数量
FROM ubuntu

ADD . /app

RUN apt-get update \  
    && apt-get install -y nodejs \
    && cd /app \
    && npm install

CMD npm start
  • 构建完成后删除多余文件。例如 apt update后在/var/lib/apt/lists中的数据要删除
FROM ubuntu:16.04

RUN apt-get update \  
    && apt-get install -y nodejs \
    # added lines
    && rm -rf /var/lib/apt/lists/*

ADD . /app  
RUN cd /app && npm install

CMD npm start
  • 设置apt源
# ubunt 18.04
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
  • 设置 pip 源
    • 注意路径
RUN mkdir /root/.pip/ && \
    echo "[global]" > /root/.pip/pip.conf && \
    echo "index-url = http://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf && \
    echo "[install]" >> /root/.pip/pip.conf && \
    echo "trusted-host=mirrors.aliyun.com" >> /root/.pip/pip.conf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值