Windows环境下如何在Docker中使用pg_restore导入备份文件?
Windows环境下Docker Compose PostgreSQL容器导入备份文件的解决方法
问题场景
通过docker-compose启动web和PostgreSQL(db服务)两个容器,需使用pg_restore导入自定义备份文件。docker-compose配置如下:
version: '3.8' services: web: build: . command: python /code/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 stdin_open: true tty: true depends_on: - db environment: - "DJANGO_SECRET_KEY=django-insecure-rt@&+(5fp=+$$hj87no^w40l&d-q6wk5b3jdvos_=kt#@+85b8f" - "DJANGO_DEBUG=True" - "ALLOWED_HOSTS=172.105.16.56,.smartmark.ca,localhost,127.0.0.1" db: image: postgres:11 volumes: - postgres_data:/var/lib/postgresql/data/ environment: - "POSTGRES_HOST_AUTH_METHOD=trust" volumes: postgres_data:
尝试执行以下命令时出错:
docker-compose exec smartmark-db-1 pg_restore -U postgres -d postgres export.dbase
报错信息:service "smartmark-db-1" is not running container #1
通过docker ps确认容器实际名称为smarmark-db-1。
另外尝试重定向命令时,Windows命令行报错:
docker exec -i container_name pg_restore -Fc -U admin_username -d database_name < pg_dump_Fc_file
报错信息:The '<' operator is reserved for future use.
错误原因
- docker-compose exec参数错误:该命令需跟docker-compose配置中的服务名(即
db),而非容器名称。 - Windows CMD不支持重定向:默认命令提示符(CMD)不识别
<输入重定向语法,PowerShell或类Unix终端(如Git Bash)支持该语法。
解决步骤
方法一:用docker-compose exec(推荐)
直接通过服务名操作,无需关注容器名称:
- 若备份文件在本地目录,先修改docker-compose.yaml,将备份目录挂载到db服务:
db: image: postgres:11 volumes: - postgres_data:/var/lib/postgresql/data/ - ./backups:/backups # 新增挂载,本地backups目录对应容器内/backups environment: - "POSTGRES_HOST_AUTH_METHOD=trust"
执行docker-compose up -d重启db服务。
- 执行导入命令:
docker-compose exec db pg_restore -U postgres -d postgres /backups/export.dbase
方法二:用docker exec配合容器名
解决重定向问题:
- 切换到PowerShell执行(替换容器名和备份文件名):
docker exec -i smarmark-db-1 pg_restore -U postgres -d postgres < export.dbase- 或使用Git Bash等类Unix终端执行原命令。
先复制备份文件到容器再导入:
- 将本地备份文件复制到容器临时目录:
docker cp export.dbase smarmark-db-1:/tmp/export.dbase- 进入容器执行导入:
docker exec -it smarmark-db-1 pg_restore -U postgres -d postgres /tmp/export.dbase
内容的提问来源于stack exchange,提问作者Doug Smith
相关产品推荐
相关产品推荐

