本文使用Dify v0.6.14
版本,主要介绍了Dify
镜像的构建、导入、导出等操作,以及通过Docker Compose
部署和更新Dify
。
一.dify/dify-api:0.6.14
1.构建镜像
cd api && docker build . -t dify/dify-api:0.6.14
2.导出镜像
docker save -o dify_dify_api_0.6.14.tar dify/dify-api:0.6.14
3.导入镜像
docker load -i dify_dify_api_0.6.14.tar
二.dify/dify-web:0.6.14
1.构建镜像
cd web && docker build . -t dify/dify-web:0.6.14
2.导出镜像
docker save -o dify_dify_web_0.6.14.tar dify/dify-web:0.6.14
3.导入镜像
docker load -i dify_dify_web_0.6.14.tar
三.其它镜像
1.导出镜像
docker save -o postgres_15_alpine.tar postgres:15-alpine
docker save -o redis_6_alpine.tar redis:6-alpine
docker save -o langgenius_dify_sandbox_0_2_1.tar langgenius/dify-sandbox:0.2.1
docker save -o ubuntu_squid_latest.tar ubuntu/squid:latest
docker save -o semitechnologies_weaviate_1_19_0.tar semitechnologies/weaviate:1.19.0
docker save -o nginx_latest.tar nginx:latest
docker save -o dify_dify_api_0.6.14.tar dify/dify-api:0.6.14
docker save -o dify_dify_web_0.6.14.tar dify/dify-web:0.6.14
2.导入镜像
docker load -i postgres_15_alpine.tar
docker load -i redis_6_alpine.tar
docker load -i langgenius_dify_sandbox_0_2_1.tar
docker load -i ubuntu_squid_latest.tar
docker load -i semitechnologies_weaviate_1_19_0.tar
docker load -i nginx_latest.tar
docker load -i dify_dify_api_0.6.14.tar
docker load -i dify_dify_web_0.6.14.tar
四.通过Docker Compose部署
1.Docker Compose部署 [2]
cd dify/docker
cp .env.example .env
docker compose up -d
2.更新dify/docker内容 [2]
cd dify/docker
docker compose down
# 备份docker目录
# 导入镜像
# 更新.env文件
# 更新docker-compose.yaml文件
docker compose up -d
五.迁移卷目录和数据卷
1.迁移卷目录
通过docker-compose.yaml
文件可看到,有不少服务是通过”本地目录映射”进行数据持久化,迁移方式即拷贝。

(1)停止所有服务
docker-compose down
(2)打包传输卷目录
tar -czvf dify-volumes.tar.gz ./volumes
(3)在服务器上解压
tar -xzvf dify-volumes.tar.gz
2.迁移数据卷
通过docker-compose.yaml
文件可看到,有些服务采用”数据卷”来实现数据持久化。迁移方式要稍微复杂一些,以oradata
和dify_es01_data
为例进行讲解。

(1)找到卷的位置
这会显示卷的物理存储路径,通常在 /var/lib/docker/volumes/
目录下。
docker volume inspect oradata dify_es01_data
特别说明:
当使用
docker compose -p dify
命令指定项目名为 “dify
” 时,Docker Compose
会自动在所有创建的资源(包括卷、容器和网络)名称前添加项目名作为前缀。
(2)备份数据卷内容
方法1:创建中转容器(推荐)
# 创建临时容器连接卷并将数据复制到本地
docker run --rm -v oradata:/source -v $(pwd)/backup:/backup alpine sh -c "cd /source && tar czf /backup/oradata.tar.gz ."
docker run --rm -v dify_es01_data:/source -v $(pwd)/backup:/backup alpine sh -c "cd /source && tar czf /backup/es_data.tar.gz ."
方法2:如果有root权限,直接操作卷目录
# 获取卷的挂载点
ORADATA_PATH=$(docker volume inspect -f '{{.Mountpoint}}' oradata)
ES_DATA_PATH=$(docker volume inspect -f '{{.Mountpoint}}' dify_es01_data)
# 打包数据
sudo tar -czf oradata_backup.tar.gz -C $ORADATA_PATH .
sudo tar -czf es_data_backup.tar.gz -C $ES_DATA_PATH .
(3)将备份文件传输到服务器
scp oradata_backup.tar.gz es_data_backup.tar.gz user@server:/path/to/destination
(4)在服务器上创建新的数据卷并恢复数据
# 在服务器上创建卷
docker volume create oradata
docker volume create dify_es01_data
# 恢复数据
docker run --rm -v oradata:/target -v /path/to/destination:/backup alpine sh -c "cd /target && tar xzf /backup/oradata_backup.tar.gz"
docker run --rm -v dify_es01_data:/target -v /path/to/destination:/backup alpine sh -c "cd /target && tar xzf /backup/es_data_backup.tar.gz"
六.相关知识点
1.docker和docker-legacy
由于历史遗留问题,在Dify
源码目录下存在docker
(推荐新建)和docker-legacy
(历史旧的)两个目录,具体区别和联系详细参考文献[1]。

2.privkeys和SECRET_KEY

(1)dify\api\storage\privkeys
创建租户的时候generate_key_pair()
生成的。
(2)dify\api\.env
中的SECRET_KEY
SECRET_KEY
是一个用于签名会话 cookie
的密钥,通常用于应用程序的安全性配置。
3.镜像忽略storage目录
通过Dockerfile
打包Dify
镜像时,会忽略storage
目录,因为该目录包含隐私信息。

4.docker run --rm
通用命令模版
(1)通用命令模板
docker run --rm \
-v <host_volume_or_path>:<container_path> \
-v <host_backup_dir>:<container_backup_path> \
<image_name> \
sh -c "<shell_commands_inside_container>"
组件 | 含义与用途 |
---|---|
|
|
|
|
|
|
|
|
|
|
(2)示例1:从Docker卷打包备份到主机
将 Docker 卷 mydata
中的所有内容打包成 mydata.tar.gz
,输出到当前主机目录。
docker run --rm \
-v mydata:/source \
-v $(pwd):/backup \
alpine \
sh -c "cd /source && tar czf /backup/mydata.tar.gz ."
(3)示例2:还原压缩包到数据卷
将主机目录下的压缩包解压到名为 mydata
的数据卷中。
docker run --rm \
-v mydata:/target \
-v $(pwd):/backup \
alpine \
sh -c "cd /target && tar xzf /backup/mydata.tar.gz"
(4)恢复数据示例
使用Docker
,将一个压缩备份文件oradata_backup.tar.gz
解压到名为oradata
的Docker
数据卷中。
docker run --rm \
-v oradata:/target \
-v /path/to/destination:/backup \
alpine \
sh -c "cd /target && tar xzf /backup/oradata_backup.tar.gz"
命令 | 解释 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
参考文献
[0] Dify镜像相关操作:构建、导入、导出等:https://z0yrmerhgi8.feishu.cn/wiki/U5ZfwGzJ8iyHqKkRg1Nc4mAanNf
[1] Dify的Docker部署指南 (中文翻译):https://z0yrmerhgi8.feishu.cn/wiki/GDscwWIeiir986kTkyNcIZZAnpe
[2] Docker Compose部署:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose
知识星球:Dify源码剖析及答疑,Dify扩展系统源码,AI书籍课程|AI报告论文,公众号付费资料。加微信buxingtianxia21
进NLP工程化资料群,以及Dify交流群。
(文:NLP工程化)