Dockerfile的语法及示例

前言

Dockerfile是用于构建Docker镜像的文本文件,其中包含一系列指令,用于描述镜像的构建步骤和配置信息。通过Dockerfile,可以让用户自动化地构建镜像,并确保在不同的环境中获得相同的镜像。

Dockerfile的语法包括以下几个关键指令:

  1. FROM:指定基础镜像,格式为FROM <image>,用于指定构建镜像所基于的基础镜像。
  2. MAINTAINER:指定镜像的作者和联系方式,格式为MAINTAINER <name>
  3. RUN:用于在镜像中执行命令,格式为RUN <command>,可以累积多个RUN指令以构建镜像。
  4. ADD和COPY:用于将文件或目录复制到镜像中,格式为ADD <src> <dest>COPY <src> <dest>
  5. CMD:指定容器启动时执行的默认命令,可以在Dockerfile中只有一个CMD指令,如果有多个CMD指令,只有最后一个生效。
  6. EXPOSE:声明容器在运行时需要监听的端口,格式为EXPOSE <port>
  7. ENV:设置环境变量,格式为ENV <key> <value>
  8. WORKDIR:指定在容器中执行命令的工作目录,格式为WORKDIR <path>
  9. ENTRYPOINT:配置容器启动时执行的命令,格式为ENTRYPOINT <command>
  10. VOLUME:声明容器数据卷,格式为VOLUME <path>

除了这些基本指令外,Dockerfile还支持其他一些指令,可以根据具体需求选择使用。

在编写Dockerfile时,建议遵循最佳实践,减少镜像大小、优化镜像构建速度,并保持Dockerfile的可读性和可维护性。

作者信息

1
MAINTAINER psvmc "psvmc@outlook.com"

基本镜像和环境

1
2
3
4
5
6
7
# Pull base image
FROM centos:7
# Set Charset
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

安装wget

1
2
# 安装 wget
RUN yum -y install wget

YUM环境

YUM镜像

阿里的

1
2
3
# YUM镜像
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum makecache

或者使用华为的

1
2
3
# YUM镜像
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
RUN yum makecache

安装Python

1
2
3
# 安装Python
RUN yum install -y epel-release
RUN yum install -y python2

安装FFMpeg

1
2
3
4
5
6
# 安装ffmpeg
RUN yum install epel-release -y
RUN yum update -y
RUN rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
RUN rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
RUN yum install ffmpeg ffmpeg-devel -y

安装C++编译环境

1
2
# 安装 gcc
RUN yum -y install gcc+ gcc-c++ automake autoconf libtool make

Node环境

安装NodeJS

1
2
3
4
5
6
RUN wget https://mirrors.huaweicloud.com/nodejs/v10.24.0/node-v10.24.0-linux-x64.tar.xz
RUN tar -xvf node-v10.24.0-linux-x64.tar.xz
RUN mv node-v10.24.0-linux-x64 /usr/local/nodejs10
RUN rm -rf node-v10.24.0-linux-x64.tar.xz
ENV NODE_HOME /usr/local/nodejs10
ENV PATH $PATH:$NODE_HOME/bin

NodeJS官方源地址

1
RUN wget https://nodejs.org/dist/v10.24.0/node-v10.24.0-linux-x64.tar.xz

设置NPM镜像

淘宝的

1
2
3
4
5
6
7
# NPM镜像
RUN npm config set registry https://registry.npmmirror.com/
RUN npm config set disturl https://npm.taobao.org/mirrors/node/
RUN npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
RUN npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
RUN npm config set python_mirror https://npm.taobao.org/mirrors/python/
RUN npm cache clean -f

华为的

1
2
3
4
# NPM镜像
RUN npm config set registry https://repo.huaweicloud.com/repository/npm/
RUN npm config set disturl https://repo.huaweicloud.com/nodejs
RUN npm cache clean -f

安装 node-gyp

1
2
# 安装 node-gyp
RUN npm install -g node-gyp@6.1.0

注意:

node-gyp 需要在系统中安装 C++ 编译器和 Python 环境。

项目配置

创建文件夹

1
RUN mkdir /data

进入文件夹

1
RUN cd /data

添加文件到容器内

1
ADD startup.sh /data/school_live_record/startup.sh

添加文件夹到容器内

1
ADD record /data/school_live_record/record

添加执行权限

1
RUN chmod +x /data/school_live_record/startup.sh

移动文件

1
RUN mv ./Agora_Recording_SDK_for_Linux_FULL/* /data/school_live_record/record/src/sdk/

删除文件

1
RUN rm -rf zxvf Agora_Recording_SDK_for_Linux_v3.0.5_20210106-1609927649_793.tar.gz

指定启动目录和程序

1
2
WORKDIR /data/school_live_record/
ENTRYPOINT ./startup.sh

这两个指令在 Dockerfile 中扮演着不同的角色:

WORKDIR:

该指令用于设置容器中的工作目录。

在例子中,WORKDIR /data/school_live_record/ 会将容器的工作目录设置为 /data/school_live_record/,这意味着在后续的命令中,相对路径都会基于这个工作目录进行解析。

ENTRYPOINT:

该指令用于配置容器启动时执行的默认命令。

在例子中,ENTRYPOINT ./startup.sh 指定了容器启动时需要执行的脚本或命令,这个命令会成为容器的主要进程。

如果你在运行容器时提供了其他命令,它们会被作为参数传递给 ENTRYPOINT 指定的命令。

因此,这两个指令结合起来的作用是,在容器启动时,首先将工作目录设置为指定的目录,然后执行 startup.sh 脚本作为容器的主要进程。

这样可以方便地配置容器启动时执行的默认操作。

整体示例

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
MAINTAINER psvmc "psvmc@outlook.com"

# Pull base image
FROM centos:7

# Set Charset
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 安装 wget
RUN yum -y install wget

# YUM镜像
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum makecache

# 安装ffmpeg
RUN yum install epel-release -y
RUN yum update -y
RUN rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
RUN rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
RUN yum install ffmpeg ffmpeg-devel -y

# 安装Python
RUN yum install -y epel-release
RUN yum install -y python2

# 安装 gcc
RUN yum -y install gcc+ gcc-c++ automake autoconf libtool make

# 安装 nodejs
RUN wget https://mirrors.huaweicloud.com/nodejs/v10.24.0/node-v10.24.0-linux-x64.tar.xz
RUN tar -xvf node-v10.24.0-linux-x64.tar.xz
RUN mv node-v10.24.0-linux-x64 /usr/local/nodejs10
RUN rm -rf node-v10.24.0-linux-x64.tar.xz
ENV NODE_HOME /usr/local/nodejs10
ENV PATH $PATH:$NODE_HOME/bin

# NPM镜像
RUN npm config set registry https://registry.npmmirror.com/
RUN npm config set disturl https://npm.taobao.org/mirrors/node/
RUN npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
RUN npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
RUN npm config set python_mirror https://npm.taobao.org/mirrors/python/
RUN npm cache clean -f

# 安装 node-gyp
RUN npm install -g node-gyp@6.1.0

# 项目配置
RUN mkdir /data
RUN mkdir /data/school_live_record
RUN cd /data
ADD startup.sh /data/school_live_record/startup.sh
RUN chmod +x /data/school_live_record/startup.sh
ADD record /data/school_live_record/record
ADD server /data/school_live_record/server
RUN wget https://download.agora.io/ardsdk/release/Agora_Recording_SDK_for_Linux_v3.0.5_20210106-1609927649_793.tar.gz
RUN tar zxvf Agora_Recording_SDK_for_Linux_v3.0.5_20210106-1609927649_793.tar.gz
RUN mkdir /data/school_live_record/record/src/sdk/
RUN mv ./Agora_Recording_SDK_for_Linux_FULL/* /data/school_live_record/record/src/sdk/
RUN rm -rf zxvf Agora_Recording_SDK_for_Linux_v3.0.5_20210106-1609927649_793.tar.gz
RUN cd /data/school_live_record/record && chmod +x /data/school_live_record/record/build_debug.sh && /data/school_live_record/record/build_debug.sh
RUN cd /data/school_live_record/server && mkdir -p /data/school_live_record/server/output/liverecord && npm install

# Expose ports.
EXPOSE 7000

# Define default command.
WORKDIR /data/school_live_record/
ENTRYPOINT ./startup.sh

如果build_debug.sh构建的时候进度不动,可以把

1
RUN cd /data/school_live_record/record && chmod +x /data/school_live_record/record/build_debug.sh && /data/school_live_record/record/build_debug.sh

替换为

1
ADD agorasdk.node /data/school_live_record/record/agorasdk.node

把别的服务器上容器内的agorasdk.node放在Dockerfile同级