基于docker 28.5.1和cvat的稳定版本组合,确保最佳兼容性。
推荐稳定版本组合
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| docker | 28.5.1 | 当前稳定版本 |
| cvat | 2.48.0 | 兼容docker 28.x |
| docker compose | v2.40.3 | docker 28.x内置compose |
系统要求
- ubuntu 22.04/20.04 lts
- 至少 4gb ram(推荐8gb+)
- 至少 20gb 可用磁盘空间
- 网络连接(用于下载镜像)
第一步:安装docker
1.1 卸载旧版本(可选)
sudo apt-get remove docker docker-engine docker.io containerd runc
1.2 更新系统并安装依赖
sudo apt-get update sudo apt-get install ca-certificates curl
1.3 创建密钥目录并添加docker官方gpg密钥
sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fssl https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
1.4 添加docker仓库到apt源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${ubuntu_codename:-$version_codename}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null1.5 更新包列表并安装docker
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.6 锁定docker版本防止自动升级(可选)
sudo apt-mark hold docker-ce docker-ce-cli containerd.io
第二步:配置docker国内镜像源加速
2.1 配置docker国内镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<eof
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://hub.rat.dev",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.tbedu.top/",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
eof2.2 重启docker服务
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl enable docker
2.3 创建docker用户组并添加当前用户
sudo groupadd docker sudo usermod -ag docker $user newgrp docker
2.4 验证docker安装
docker --version docker compose version
应该显示:
docker version 28.5.1 docker compose version v2.40.3
第三步:安装cvat
3.1 克隆cvat 2.48.0
cd ~ git clone -b 2.48.0 https://github.com/cvat-ai/cvat cd cvat
3.2 设置cvat访问地址
# 获取本机ip地址
export cvat_host=$(hostname -i | awk '{print $1}')
echo "export cvat_host=$cvat_host" >> ~/.bashrc
# 设置cvat版本环境变量
echo "export cvat_version=2.48.0" >> ~/.bashrc
source ~/.bashrc
echo "cvat将可通过 http://$cvat_host:8080 访问"第四步:启动cvat服务
4.1 启动cvat
根据自己的需求启动方式二选一
4.1.1 启动预构docker镜像
运行 docker 容器。下载最新的 cvat 需要一些时间以及其他所需的映像,如 postgres、redis 和 start 容器。
docker compose up -d
如果提示超时可以多运行几遍,
4.1.2 本地编译构建
docker compose -f docker-compose.yml -f docker-compose.dev.yml build
本地构建也可能会报关于网络超时的问题,多试几次(此处耗时较多)。
关于本地构建需要修改的几处代码:
在dockerfile中添加国内镜像源配置(以下为修改后完整的dockerfile文件,可直接复制)
arg pip_version=24.2
arg base_image=ubuntu:22.04
from ${base_image} as build-image-base
# 配置pip国内镜像源
env pip_index_url=https://pypi.tuna.tsinghua.edu.cn/simple
env pip_trusted_host=pypi.tuna.tsinghua.edu.cn
env pip_extra_index_url=https://pypi.org/simple
env pip_timeout=300
env pip_retries=10
# 完全重写sources.list使用清华大学镜像源
run echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list
# 配置apt下载优化
run echo 'acquire::retries "5";' > /etc/apt/apt.conf.d/80-retries && \
echo 'acquire::http::timeout "120";' >> /etc/apt/apt.conf.d/80-retries
run apt-get update && \
debian_frontend=noninteractive apt-get --no-install-recommends install -yq \
curl \
g++ \
gcc \
git \
libgeos-dev \
libldap2-dev \
libsasl2-dev \
make \
nasm \
pkg-config \
python3-dev \
python3-pip \
libxml2-dev \
libxmlsec1-dev \
libxmlsec1-openssl \
libhdf5-dev \
cargo \
wget \
# 添加完整的ffmpeg开发包
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavdevice-dev \
libavutil-dev \
libavfilter-dev \
libswscale-dev \
libswresample-dev \
libpostproc-dev \
libopenh264-dev \
libx264-dev \
&& rm -rf /var/lib/apt/lists/*
# 配置pip使用国内源
run python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
python3 -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn && \
python3 -m pip config set global.timeout 300 && \
python3 -m pip config set global.retries 10
# 配置git使用国内镜像
run git config --global url."https://gitclone.com/github.com/".insteadof "https://github.com/"
arg pip_version
env pip_disable_pip_version_check=1
run --mount=type=cache,target=/root/.cache/pip/http \
python3 -m pip install -u pip==${pip_version}
# we build openh264, ffmpeg and pyav in a separate build stage,
# because this way docker can do it in parallel to all the other packages.
from build-image-base as build-image-av
# 确保使用国内镜像源
run python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
python3 -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn && \
python3 -m pip config set global.timeout 300 && \
python3 -m pip config set global.retries 10
# 使用系统包管理器安装视频编解码器
arg prefix=/opt/ffmpeg
arg pkg_config_path=${prefix}/lib/pkgconfig
env ffmpeg_version=8.0 \
openh264_version=2.6.0
# 安装完整的ffmpeg开发包
run apt-get update && \
debian_frontend=noninteractive apt-get --no-install-recommends install -yq \
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavdevice-dev \
libavutil-dev \
libavfilter-dev \
libswscale-dev \
libswresample-dev \
libpostproc-dev \
libopenh264-dev \
libx264-dev \
&& rm -rf /var/lib/apt/lists/*
# 创建符号链接到指定目录(为了兼容原有路径)
workdir /tmp/openh264
run echo "使用系统openh264库" && \
mkdir -p ${prefix}/lib ${prefix}/include && \
# 复制openh264库文件
cp /usr/lib/x86_64-linux-gnu/libopenh264.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/include/openh264/* ${prefix}/include/ 2>/dev/null || true && \
# 确保库文件存在
(test -f ${prefix}/lib/libopenh264.so || ln -sf /usr/lib/x86_64-linux-gnu/libopenh264.so ${prefix}/lib/libopenh264.so) 2>/dev/null || true
workdir /tmp/ffmpeg
run echo "使用系统ffmpeg" && \
mkdir -p ${prefix}/bin ${prefix}/lib ${prefix}/include && \
# 复制ffmpeg二进制和库文件
cp /usr/bin/ffmpeg ${prefix}/bin/ 2>/dev/null || true && \
cp /usr/bin/ffprobe ${prefix}/bin/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libavcodec.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libavformat.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libavdevice.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libavutil.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libavfilter.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libswscale.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libswresample.so* ${prefix}/lib/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/libpostproc.so* ${prefix}/lib/ 2>/dev/null || true && \
# 复制头文件
cp -r /usr/include/x86_64-linux-gnu/libav* ${prefix}/include/ 2>/dev/null || true && \
cp -r /usr/include/x86_64-linux-gnu/libsw* ${prefix}/include/ 2>/dev/null || true && \
# 创建pkg-config文件目录
mkdir -p ${prefix}/lib/pkgconfig && \
# 复制pkg-config文件
cp /usr/lib/x86_64-linux-gnu/pkgconfig/libav*.pc ${prefix}/lib/pkgconfig/ 2>/dev/null || true && \
cp /usr/lib/x86_64-linux-gnu/pkgconfig/libsw*.pc ${prefix}/lib/pkgconfig/ 2>/dev/null || true
# 设置pkg-config路径
env pkg_config_path=${prefix}/lib/pkgconfig:${pkg_config_path}
copy utils/dataset_manifest/requirements.txt /tmp/utils/dataset_manifest/requirements.txt
# since we're using pip-compile-multi, each dependency can only be listed in
# one requirements file. in the case of pyav, that should be
# `dataset_manifest/requirements.txt`. make sure it's actually there,
# and then remove everything else.
run grep -q '^av==' /tmp/utils/dataset_manifest/requirements.txt
# 修改pyav版本为兼容系统ffmpeg的版本
run sed -i 's/^av==15.1.0/av==12.0.0/' /tmp/utils/dataset_manifest/requirements.txt
run sed -i '/^av==/!d' /tmp/utils/dataset_manifest/requirements.txt
run --mount=type=cache,target=/root/.cache/pip/http-v2 \
python3 -m pip wheel --no-binary=av \
-r /tmp/utils/dataset_manifest/requirements.txt \
-w /tmp/wheelhouse
# this stage builds wheels for all dependencies (except pyav)
from build-image-base as build-image
# 确保build-image阶段也使用国内源 - 使用阿里云镜像
run python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
python3 -m pip config set global.trusted-host mirrors.aliyun.com && \
python3 -m pip config set global.timeout 600 && \
python3 -m pip config set global.retries 15
copy cvat/requirements/ /tmp/cvat/requirements/
copy utils/dataset_manifest/requirements.txt /tmp/utils/dataset_manifest/requirements.txt
# exclude av from the requirements file
run sed -i '/^av==/d' /tmp/utils/dataset_manifest/requirements.txt
# 更新所有文件中的numpy版本以解决依赖冲突
run sed -i 's/^numpy==.*/numpy==1.24.3/' /tmp/cvat/requirements/production.txt && \
sed -i 's/^numpy==.*/numpy==1.24.3/' /tmp/cvat/requirements/base.txt 2>/dev/null || true && \
sed -i 's/^numpy==.*/numpy==1.24.3/' /tmp/utils/dataset_manifest/requirements.txt
# 修正pyyaml版本冲突
run sed -i 's/^pyyaml==6.0.3/pyyaml==6.0.2/' /tmp/cvat/requirements/base.txt && \
sed -i 's/^pyyaml==6.0.3/pyyaml==6.0.2/' /tmp/cvat/requirements/production.txt
arg cvat_configuration="production"
run --mount=type=cache,target=/root/.cache/pip/http-v2 \
datumaro_headless=1 python3 -m pip wheel --no-deps --no-binary lxml,xmlsec \
-r /tmp/cvat/requirements/${cvat_configuration}.txt \
-w /tmp/wheelhouse
from golang:1.24.4 as build-smokescreen
# 使用国内镜像下载smokescreen
run git clone --filter=blob:none --no-checkout https://gitclone.com/github.com/stripe/smokescreen.git
run cd smokescreen && git checkout master && go build -o /tmp/smokescreen
from ${base_image}
arg http_proxy
arg https_proxy
arg no_proxy
arg socks_proxy
arg tz="etc/utc"
env term=xterm \
http_proxy=${http_proxy} \
https_proxy=${https_proxy} \
no_proxy=${no_proxy} \
socks_proxy=${socks_proxy} \
lang='c.utf-8' \
lc_all='c.utf-8' \
tz=${tz}
# 配置pip国内镜像源(最终镜像)- 添加阿里云源
env pip_index_url=https://mirrors.aliyun.com/pypi/simple/
env pip_trusted_host=mirrors.aliyun.com
env pip_extra_index_url=https://pypi.tuna.tsinghua.edu.cn/simple
env pip_timeout=600
env pip_retries=15
arg user="django"
arg cvat_configuration="production"
env django_settings_module="cvat.settings.${cvat_configuration}"
# install necessary apt packages
run apt-get update && \
debian_frontend=noninteractive apt-get --no-install-recommends install -yq \
bzip2 \
ca-certificates \
curl \
git \
libgeos-c1v5 \
libgl1 \
libgomp1 \
libldap-2.5-0 \
libpython3.10 \
libsasl2-2 \
libxml2 \
libxmlsec1 \
libxmlsec1-openssl \
nginx \
p7zip-full \
poppler-utils \
python3 \
python3-venv \
supervisor \
tzdata \
unrar \
wait-for-it \
# 安装运行时视频编解码器库
ffmpeg \
libavcodec58 \
libavformat58 \
libavdevice58 \
libavutil56 \
libavfilter7 \
libswscale5 \
libswresample3 \
libpostproc55 \
&& ln -fs /usr/share/zoneinfo/${tz} /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata && \
rm -rf /var/lib/apt/lists/* && \
echo 'application/wasm wasm' >> /etc/mime.types
# install smokescreen
copy --from=build-smokescreen /tmp/smokescreen /usr/local/bin/smokescreen
# add a non-root user
env user=${user}
env home /home/${user}
run adduser --uid=1000 --shell /bin/bash --disabled-password --gecos "" ${user}
arg clam_av="no"
run if [ "$clam_av" = "yes" ]; then \
apt-get update && \
apt-get --no-install-recommends install -yq \
clamav \
libclamunrar9 && \
sed -i 's/receivetimeout 30/receivetimeout 300/g' /etc/clamav/freshclam.conf && \
freshclam && \
chown -r ${user}:${user} /var/lib/clamav && \
rm -rf /var/lib/apt/lists/*; \
fi
# install wheels from the build image
run python3 -m venv /opt/venv
env path="/opt/venv/bin:${path}"
# 配置虚拟环境中的pip使用国内源
run /opt/venv/bin/python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
/opt/venv/bin/python3 -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn && \
/opt/venv/bin/python3 -m pip config set global.timeout 300 && \
/opt/venv/bin/python3 -m pip config set global.retries 10
# prevent security scanners from finding vulnerabilities in whatever version of setuptools
# is included in ubuntu by default.
run python -m pip uninstall -y setuptools
arg pip_version
arg pip_disable_pip_version_check=1
run python -m pip install -u pip==${pip_version}
run --mount=type=bind,from=build-image,source=/tmp/wheelhouse,target=/mnt/wheelhouse \
--mount=type=bind,from=build-image-av,source=/tmp/wheelhouse,target=/mnt/wheelhouse-av \
python -m pip install --no-index /mnt/wheelhouse/*.whl /mnt/wheelhouse-av/*.whl
env numprocs=1
copy --from=build-image-av /opt/ffmpeg/lib /usr/lib
# these variables are required for supervisord substitutions in files
# this library allows remote python debugging with vs code
arg cvat_debug_enabled
run if [ "${cvat_debug_enabled}" = 'yes' ]; then \
python3 -m pip install --no-cache-dir debugpy; \
fi
# removing pip due to security reasons. see: https://scout.docker.com/vulnerabilities/id/cve-2018-20225
# the vulnerability is dubious and we don't use pip at runtime, but some vulnerability scanners mark it as a high vulnerability,
# and it was decided to remove pip from the final image
run python -m pip uninstall -y pip
# install and initialize cvat, copy all necessary files
copy cvat/nginx.conf /etc/nginx/nginx.conf
copy --chown=${user} supervisord/ ${home}/supervisord
copy --chown=${user} backend_entrypoint.d/ ${home}/backend_entrypoint.d
copy --chown=${user} manage.py rqscheduler.py backend_entrypoint.sh wait_for_deps.sh ${home}/
copy --chown=${user} utils/ ${home}/utils
copy --chown=${user} cvat/ ${home}/cvat
copy --chown=${user} components/analytics/clickhouse/init.py ${home}/components/analytics/clickhouse/init.py
arg coverage_process_start
run if [ "${coverage_process_start}" ]; then \
echo "import coverage; coverage.process_startup()" > /opt/venv/lib/python3.10/site-packages/coverage_subprocess.pth; \
fi
# run all commands below as 'django' user.
# use numeric uid/gid so that the image is compatible with the kubernetes runasnonroot setting.
user 1000:1000
workdir ${home}
run mkdir -p data share keys logs /tmp/supervisord static
expose 8080
entrypoint ["./backend_entrypoint.sh"]修改./cvat/requirements/base.txt
# 完全移除版本限制,让pip选择兼容版本 sed -i 's/==/>=/g' cvat/requirements/base.txt
清理缓存
# 如果遇到损坏的包或者不匹配的包需要清理缓存,重新构建
docker builder prune -f
# 也可以使用docker build直接构建特定阶段
docker build \
--target build-image \
--no-cache \
-t cvat_server_build_image \
-f dockerfile .
# 然后继续使用compose构建
docker compose -f docker-compose.yml -f docker-compose.dev.yml build cvat_server4.2 监控启动过程
# 实时查看启动日志(可选) docker compose logs -f & # 等待服务完全启动(重要!) echo "等待cvat服务启动,这可能需要3-5分钟..." sleep 180
4.3 检查所有服务状态
docker compose ps
预期正常状态:
name service status ports cvat_db cvat_db running cvat_redis cvat_redis running cvat_server cvat_server running 8080/tcp cvat_ui cvat_ui running 80/tcp ... 所有服务都是running状态
4.4 如果服务异常的处理
# 如果服务没有正常启动,执行清理重启 docker compose down docker system prune -f docker volume prune -f # 重新启动 docker compose up -d sleep 180 docker compose ps
第五步:创建管理员账户
5.1 等待数据库完全就绪
# 检查数据库状态 until docker logs cvat_db 2>&1 | grep -q "database system is ready to accept connections"; do echo "等待数据库启动..." sleep 10 done echo "数据库已就绪"
5.2 创建超级用户
# 方法1:直接创建 docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser' # 方法2:如果方法1失败,先进入容器再创建 docker exec -it cvat_server bash # 在容器内执行: python3 ~/manage.py createsuperuser # 创建完成后输入 exit 退出容器
按照提示输入管理员信息:
用户名: admin 电子邮件: admin@example.com 密码: ******** (建议使用强密码) 密码确认: ******** superuser created successfully.
第六步:验证安装和访问
6.1 最终状态检查
# 检查所有服务状态 docker compose ps # 检查cvat服务日志 docker logs cvat_server | tail -10 # 获取最终访问信息 echo "===========================================" echo "cvat安装完成!" echo "访问地址: http://$cvat_host:8080" echo "管理员用户名: admin" echo "使用您设置的密码登录" echo "==========================================="
6.2 浏览器访问测试
在浏览器中访问 http://您的服务器ip:8080:
- 使用
admin和您设置的密码登录 - 确认可以正常进入cvat界面
- 尝试创建一个测试任务验证功能正常
访问方式详解
7.1 局域网内直接访问
http://服务器ip:8080
示例:如果服务器ip是 192.168.1.100,则访问 http://192.168.1.100:8080
7.2 外部网络访问(ssh隧道)
# 在您的笔记本电脑上执行 ssh -l 8080:localhost:8080 用户名@服务器ip -n # 后台运行版本 ssh -l 8080:localhost:8080 用户名@服务器ip -n -f # 然后浏览器访问 # http://localhost:8080
7.3 浏览器要求
- ✅ google chrome (90+,推荐)
- ✅ microsoft edge (90+)
- ✅ brave (基于chromium)
- ⚠️ firefox (可能部分功能不兼容)
- ❌ safari (不推荐)
维护和管理命令
8.1 日常管理
# 停止cvat服务 cd ~/cvat && docker compose down # 启动cvat服务 cd ~/cvat && docker compose up -d # 查看服务状态 cd ~/cvat && docker compose ps # 查看服务日志 cd ~/cvat && docker compose logs
8.2 数据备份
# 备份数据库 docker exec cvat_db pg_dump -u root cvat > cvat_backup_$(date +%y%m%d).sql # 备份上传的文件 tar -czf cvat_data_backup_$(date +%y%m%d).tar.gz ~/cvat/data
8.3 问题诊断
# 查看详细服务状态 docker compose ps -a # 查看特定服务日志 docker compose logs cvat_server docker compose logs cvat_db # 检查资源使用 docker system df docker stats
故障排除指南
9.1 端口冲突
# 检查端口占用 sudo netstat -tulpn | grep 8080 # 修改cvat端口 # 编辑 docker-compose.override.yml 修改端口映射
9.2 磁盘空间不足
# 清理docker资源 docker system prune -a -f docker volume prune -f # 检查空间使用 df -h docker system df
9.3 服务启动失败
# 查看详细错误 docker compose logs cvat_server docker compose logs cvat_db # 完全重置 cd ~/cvat docker compose down -v docker system prune -a -f cvat_version=2.12.0 docker compose up -d
重要提醒
- 不要随意升级:避免单独升级某个组件导致兼容性问题
- 定期备份:重要标注数据定期备份到安全位置
- 监控资源:关注磁盘空间,cvat运行会占用较多资源
- 安全考虑:生产环境建议配置防火墙和https
到此这篇关于在linux服务器上安装cvat (docker 28.5.1)的文章就介绍到这了,更多相关linux服务器安装cvat内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论