Dockerfile是一个用来构建镜像的文本文件,包含了一条条构建镜像所需的指令和说明
1. 基本语法
1)FROM:指定基础镜像
语法:FROM <image>或者FROM <image>:<tag>
示例:
FROM ubuntu:18.04
第一条指令必须为FROM指令。并且,如果同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令
2)RUN:想在制作过程中运行哪些命令,在命令前面加上RUN即可
语法:RUN或者RUN ["executable","param1","param2"]
前者将在 终端中运行 ,即/bin/sh -c;后者使用exec执行。每条RUN指令将在当前镜像基础上执行指令 ,并提交为新的镜像。当命令较长时,可以使用\来换行。
示例:
RUN mkdir -p ~/.pip/
3)CMD:指定容器启动时执行的命令
语法:
支持三种格式:
CMD ["executable","param1","param2"] #使用exec执行,推荐的方式 CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用 CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
指定启动窗口时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条,只有最后一条会被执行。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
示例:
CMD ["daphne","-b","0.0.0.0","-p","8000","Django_project.asgi:application"]
4) ENV:指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持
示例:
ENV DEBIAN_FRONTEND noninteractive #静默安装
5)ADD:COPY文件,会自动解压,该命令将复制指定的文件到容器中。可以是Dockerfile所在目录的一个相对路径,一个url,也可以是一个tar文件(自动解压为目录)。ADD是增强版的COPY。
示例:
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo
6)COPY:与ADD类似,复制本地主机的到容器中,目标路径不存在时,会自动创建。如果不需要解压,优先使用COPY命令,效率更高,更节约资源。
7)WORKDIR:设置当前工作目录
为后续的RUN、CMD等指令配置容器中的工作目录。可以使用多个WORKDIR指令。
示例:
WORKDIR /app
COPY . .
2. 使用Dockerfile编译镜像
cd path/to/Dockerfile # 切换到dockerfile所在路径
docker build -t harbor.company.com/repo1/dev:tag . # harbor.company.com为harbor平台,repo1为harbor仓库名,这样编译好的镜像可以直接推送到harbor仓库
docker push harbor.company.com/repo1/dev:tag # 推送镜像
3. Dockerfile示例
FROM ubuntu:18.04
# updata apt source to tuna source
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list
# Update pip source to tuna
RUN mkdir -p ~/.pip/ && \
echo "[global]" > ~/.pip/pip.conf && \
echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> ~/.pip/pip.conf && \
echo "[install]" >> ~/.pip/pip.conf && \
echo "trusted-host = https://pypi.tuna.tsinghua.edu.cn" >> ~/.pip/pip.conf
# configure timezone
#RUN echo Asia/Shanghai > /etc/timezone
RUN apt update \
&& DEBIAN_FRONTEND=noninteractive apt install -y tzdata --no-install-recommends \
&& echo "Asia/Shanghai" > /etc/timezone \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& dpkg-reconfigure -f noninteractive tzdata
# install
RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
git make=4.2.1-1.2 g++=4:9.3.0-1ubuntu2 file python3.8 bison=2:3.5.1+dfsg-1 flex=2.6.4-6.2 openssl \
libssl-dev bc=1.07.1-2build1 libarchive-zip-perl=1.67-2 \
bsdmainutils=11.1.2ubuntu3 wget=1.20.3-1ubuntu2 cpio=2.13+dfsg-2ubuntu0.3 \
unzip=6.0-25ubuntu1.1 rsync=3.1.3-8ubuntu0.5 patch=2.7.6-6 device-tree-compiler=1.5.1-1 && \
ln -s /usr/bin/python3.8 /usr/bin/python3 && \
apt clean