部署DMS时如何用docker-compose加载本地Docker镜像?加载失败求助
解决Docker Compose加载本地镜像tar文件的问题
问题原因分析
你当前的Dockerfile写法错误:FROM docker:latest 是基于Docker CLI镜像构建,而在镜像构建过程中,容器内部没有运行Docker守护进程,因此docker load命令无法执行,这就是你看到exit code:1错误的原因。此外,这种方式也无法将tar中的镜像作为服务容器的基础镜像来使用。
解决方案
方案1:预加载本地镜像(最简单高效)
直接在宿主机上加载所有tar文件,之后在docker-compose中直接引用镜像名称即可,Docker会自动使用本地已加载的镜像,不会从仓库拉取。
- 执行以下命令加载所有本地tar文件:
# 加载postgres镜像 docker load -i ./images/postgres/postgres.tar # 加载gotenberg镜像 docker load -i ./images/gotenberg/gotenberg.tar # 加载tika镜像 docker load -i ./images/tika/tika.tar # 加载paperless镜像 docker load -i ./images/paperless/paperless-ngx.tar # 加载redis镜像 docker load -i ./images/redis/redis.tar
- 修改
docker-compose.yml,恢复使用image字段替代build字段:
version: "3.4" services: db: image: docker.io/library/postgres:15 # 使用本地已加载的镜像 restart: unless-stopped volumes: - /home/${USER}/paperless-ngx/paperless/dbdata:/var/lib/postgresql/data # 其他服务同理,恢复为对应的image字段
方案2:通过Dockerfile直接从tar构建镜像(无需手动预加载)
如果你希望完全通过docker-compose自动处理,可修改每个镜像文件夹下的Dockerfile,直接将tar文件作为基础镜像导入:
- 修改每个服务的Dockerfile(以postgres为例):
# ./images/postgres/dockerfile FROM scratch ADD postgres.tar /
该写法会将tar文件中的镜像内容直接导入到空镜像(scratch)中,生成与原镜像完全一致的新镜像。
- 调整
docker-compose.yml的build配置,移除无用的args参数:
version: "3.4" services: db: build: context: ./images/postgres dockerfile: dockerfile restart: unless-stopped volumes: - /home/${USER}/paperless-ngx/paperless/dbdata:/var/lib/postgresql/data # 其他服务同理,保持build路径对应各自的镜像文件夹
- 执行构建命令:
docker-compose build
构建完成后,docker-compose会使用这些本地构建的镜像启动服务,完全不依赖在线仓库。
内容的提问来源于stack exchange,提问作者Germán
相关产品推荐
相关产品推荐

