前言
Dockerfile是用于构建Docker镜像的文本文件,其中包含一系列指令,用于描述镜像的构建步骤和配置信息。通过Dockerfile,可以让用户自动化地构建镜像,并确保在不同的环境中获得相同的镜像。
Dockerfile的语法包括以下几个关键指令:
- FROM:指定基础镜像,格式为
FROM <image>
,用于指定构建镜像所基于的基础镜像。 - MAINTAINER:指定镜像的作者和联系方式,格式为
MAINTAINER <name>
。 - RUN:用于在镜像中执行命令,格式为
RUN <command>
,可以累积多个RUN指令以构建镜像。 - ADD和COPY:用于将文件或目录复制到镜像中,格式为
ADD <src> <dest>
或COPY <src> <dest>
。 - CMD:指定容器启动时执行的默认命令,可以在Dockerfile中只有一个CMD指令,如果有多个CMD指令,只有最后一个生效。
- EXPOSE:声明容器在运行时需要监听的端口,格式为
EXPOSE <port>
。 - ENV:设置环境变量,格式为
ENV <key> <value>
。 - WORKDIR:指定在容器中执行命令的工作目录,格式为
WORKDIR <path>
。 - ENTRYPOINT:配置容器启动时执行的命令,格式为
ENTRYPOINT <command>
。 - VOLUME:声明容器数据卷,格式为
VOLUME <path>
。
除了这些基本指令外,Dockerfile还支持其他一些指令,可以根据具体需求选择使用。
在编写Dockerfile时,建议遵循最佳实践,减少镜像大小、优化镜像构建速度,并保持Dockerfile的可读性和可维护性。
作者信息
1 | MAINTAINER psvmc "psvmc@outlook.com" |
基本镜像和环境
1 | # Pull base image |
安装wget
1 | # 安装 wget |
YUM环境
YUM镜像
阿里的
1 | # YUM镜像 |
或者使用华为的
1 | # YUM镜像 |
安装Python
1 | # 安装Python |
安装FFMpeg
1 | # 安装ffmpeg |
安装C++编译环境
1 | # 安装 gcc |
Node环境
安装NodeJS
1 | RUN wget https://mirrors.huaweicloud.com/nodejs/v10.24.0/node-v10.24.0-linux-x64.tar.xz |
NodeJS官方源地址
1 | RUN wget https://nodejs.org/dist/v10.24.0/node-v10.24.0-linux-x64.tar.xz |
设置NPM镜像
淘宝的
1 | # NPM镜像 |
华为的
1 | # NPM镜像 |
安装 node-gyp
1 | # 安装 node-gyp |
注意:
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 | WORKDIR /data/school_live_record/ |
这两个指令在 Dockerfile 中扮演着不同的角色:
WORKDIR:
该指令用于设置容器中的工作目录。
在例子中,WORKDIR /data/school_live_record/
会将容器的工作目录设置为 /data/school_live_record/
,这意味着在后续的命令中,相对路径都会基于这个工作目录进行解析。
ENTRYPOINT:
该指令用于配置容器启动时执行的默认命令。
在例子中,ENTRYPOINT ./startup.sh
指定了容器启动时需要执行的脚本或命令,这个命令会成为容器的主要进程。
如果你在运行容器时提供了其他命令,它们会被作为参数传递给 ENTRYPOINT 指定的命令。
因此,这两个指令结合起来的作用是,在容器启动时,首先将工作目录设置为指定的目录,然后执行 startup.sh 脚本作为容器的主要进程。
这样可以方便地配置容器启动时执行的默认操作。
整体示例
Dockerfile
1 | MAINTAINER psvmc "psvmc@outlook.com" |
如果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
同级