玩转Docker:第5篇 - Dockerfile详解
最编程
2024-02-04 22:49:59
...
文章目录
- 0. 前言
- 1. 通过 Dockerfile 构建镜像
- 2. 如何构建 Dockerfile
- 3. Tips
0. 前言
-
参考资料:Docker 官方文档 - Dockerfile Reference
-
主要内容包括:
- 有了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