前言
本文基于VCED项目编写,VCED 可以通过你的文字描述来自动识别视频中相符合的片段进行视频剪辑。该项目基于跨模态搜索与向量检索技术搭建,通过前后端分离的模式,帮助你快速的接触新一代搜索技术。
https://github.com/datawhalechina/vced
本文用于记录环境准备过程中的一些知识点。主要关注点是项目中提供的Docker部署方案的解析,按照教程走很简单,但如果能够借此学习Docker部署项目的过程,无疑可以获得更大的收获。
1. Docker安装
由于我是直接在Linux服务器上部署的,服务器上已经提前安装好了Docker,所以没在这一块折腾太多,这也不是本篇文章的重点,如果需要安装Docker,可以参照以下文章。
跨模态神经搜索实践VCED 环境准备
2. 项目启动细节介绍
以下是官方给的步骤
# 拉取项目
cd ~
git clone https://github.com/kainstan/vced.git
# 进入项目目录
cd ~/vced
# 通过shell脚本启动
./startup.sh
前面好理解,主要是最后一步中的startup.sh脚本,其中的一些语法,如果是不熟悉docker的同学,虽然也能够一键安装及启动,但会感觉有些懵圈。
以下是“startup.sh”的内容,重点部分加了注释,后面还会详细解释
#!/bin/bash
# ”$1"表示脚本的第一个参数
# 如果”$1"为空字符串或为”docker”,表示通过docker安装
if [ "$1" == "" -o "$1" == "docker" ]; then
# 判断服务器架构
# 如果是"arm32"、"arm64"或者"aarch64"架构
if [ `arch` = "arm32" -o `arch` = "arm64" -o `arch` = "aarch64" ]; then
# 使用docker-compose-arm.yml构建项目
docker-compose -f docker-compose-arm.yml build
# 启动项目中的所有容器
docker-compose -f docker-compose-arm.yml up -d
# 其他架构
else
# 默认使用docker-compose.yml文件构建项目并启动
docker-compose build
docker-compose up -d
fi
# 如果”$1"为"native",表示通过源码安装
elif [ "$1" == "native" ]; then
cd ~
# 更新系统信息
apt update
# 安装相应依赖
apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev -y
apt install liblzma-dev -y
apt install wget -y
apt install vim -y
apt install curl -y
apt install git -y
# 安装对应版本python
wget https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tgz -O Python-3.9.15.tgz
tar -xf Python-3.9.15.tgz
cd Python-3.9.15
./configure --enable-optimizATIons
make altinstall
# 建立软链接
ln -s /usr/local/bin/pip3.9 /usr/bin/pip
ln -s /usr/local/bin/pip3.9 /usr/bin/pip3
ln -s /usr/local/bin/python3.9 /usr/bin/python
ln -s /usr/local/bin/python3.9 /usr/bin/python3
# 安装rust
curl https://sh.rustup.rs -sSf | sh
apt install ffmpeg -y
source "$HOME/.cargo/env"
# 安装项目依赖
cd ~/vced/code/service
pip install -r requirements.txt
cd ~/vced/code/web
pip install -r requirements.txt
pip install git+https://github.com/openai/CLIP.git
# 运行前端
nohup streamlit run app.py &
# 运行后端
cd ~/vced/code/service
python app.py --timeout-ready
else
echo "脚本未执行..."
fi
由于我的电脑是x86_64架构,所以运行的是下面两行代码:
docker-compose build
docker-compose up -d
这里需要理解一下“docker-compose”命令,在实际项目中,通常会有很多容器同时运行,逐个启动这些容器会很繁琐。Docker Compose通过docker-compose.yml配置文件,可以非常轻松地,用一个命令启动这些容器。不过在本项目中,只使用了一个容器。
以下是“docker-compose.yml”文件内容:
version: "3"
services:
vced:
build:
context: code
dockerfile: Dockerfile
ports:
- "8501:8501"
version后接Docker Compose版本。其中的services部分定义了一个名为vced的服务。这个服务将使用一个名为Dockerfile的Dockerfile文件来构建镜像,该文件位于code目录中。该服务将在主机上的端口8501上暴露容器内部的端口8501。
具体的本地镜像构建过程需要查看“Dockerfile”文件,内容如下
FROM richardbst/container4vced
WORKDIR /code
COPY requirements.txt requirements.txt
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install -r requirements.txt \
&& pip install git+https://gitee.com/arcsion/CLIP.git
COPY . .
EXPOSE 8501
# CMD ["nohup","streamlit","run","/code/web/app.py","&","&&","python","/code/service/app.py"]
CMD ["sh","command.sh"]
对每行代码详细解释:
-
FROM richardbst/container4vced:指定了这个镜像的基础镜像是richardbst/container4vced。这个镜像是从dockerhub中下载的。
-
WORKDIR /code:指定了后续指令执行的工作目录是 /code。
-
COPY requirements.txt requirements.txt:将本地目录中的 requirements.txt 文件拷贝到容器中的 /code 目录中。
-
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple:设置 pip的全局镜像源地址
-
RUN pip install -r requirements.txt:从文件requirements.txt里读取需要安装的库,并安装。
-
pip install git+https://github.com/openai/CLIP.git:从github安装CLIP库。
-
COPY:将本地目录中的所有文件拷贝到容器中的 /code 目录中。
-
EXPOSE 8501:运行这个容器时需要开放的端口号。
-
CMD [“sh”,“command.sh”]:容器启动时需要运行的命令是 sh command.sh,在其中实现了前端和后端服务的分别启动。
3.效果展示
4.总结
由此,该项目使用docker启动的过程就比较清晰了,总结起来就是:
使用docker compose命令来启动服务,分两步走
1. “docker compose build” 用于构建容器所需的镜像
2. “docker-compose up -d” 利用该镜像创建一个容器
以上两步命令的配置文件是’docker-compose.yml‘,在这里主要配置了三个信息
- 服务名称
- 构建镜像所需的dockerfile地址
- 容器和主机的端口映射
在dockerfile文件中则记录了具体的镜像构建步骤