0. 前言
-
主要内容包括:
- 有了Dockerfile如何构建镜像
- 如何构建 Dockerfile
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:tag
或name
- 使用举例
# 使用当前目录下的 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 param2
或CMD ["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
类似,但作用域仅限于当前DockerfileARG <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