Dify镜像相关操作:构建、导入、导出等

本文使用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文件可看到,有些服务采用”数据卷”来实现数据持久化。迁移方式要稍微复杂一些,以oradatadify_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>"
组件 含义与用途
docker run
启动一个临时容器实例
–rm
容器执行完毕后自动删除,避免临时容器堆积
-v <A>:<B>
把主机目录或卷 A 挂载到容器内 B 路径,支持多个 -v
<image_name>
容器使用的基础镜像,例如 alpine、ubuntu
sh -c “…”
在容器内运行一条 shell 命令,例如 tar、cp、ls 等

(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解压到名为oradataDocker数据卷中。

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
运行一个新的 Docker 容器
–rm
容器运行结束后自动删除(不保留临时容器)
-v oradata:/target
将名为 oradata 的 Docker 数据卷 挂载到容器内的 /target 路径
-v /path/to/destination:/backup
将宿主机目录 /path/to/destination(其中包含 .tar.gz 备份文件)挂载为容器内的 /backup 路径
alpine
使用 Alpine Linux 作为运行镜像(轻量,默认包含 tar)
sh -c “cd /target && tar xzf /backup/oradata_backup.tar.gz”
在容器中运行 shell 命令:进入 /target,并将压缩包解压到该目录下

参考文献

[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工程化)

发表评论