【问题标题】:pg_restore: [archiver] could not open input file. No such file or directorypg_restore: [archiver] 无法打开输入文件。没有相应的文件和目录
【发布时间】:2017-07-18 10:33:59
【问题描述】:

我想将保存在 Windows 上的数据库导入 Docker 上的 PostgreSQL 容器中。

成功构建并发布容器后,我使用docker-compose up –d 运行Docker 容器,然后尝试将数据库导入项目中。

user@DESKTOP-A2MVLM4 MINGW64 ~/dockerProjectImage (master)
$ docker-compose exec db pg_restore -U fewo -h localhost --dbname=dbName backups/backup.psql

在 Windows 上,我的目录结构如下:

现在我尝试从名为 backups 的文件夹中导入数据库 backup.psql,该文件夹包含 backup.psql 文件。

但我得到一个错误:

user@DESKTOP-A2MVLM4 MINGW64 ~/dockerProjectImage (master)
    $ docker-compose exec db pg_restore -U fewo -h localhost --dbname=dbName backups/backup.psql
    pg_restore: [archiver] could not open input file "backups/backup.psql": No such file or directory

虽然目录和文件都可用。

docker-compose.yml:

version: '2'
services:

  web:
    image: image-url-web:latest
    links:
      - db
      - memcached
      - solr
    ports:
      - 8080:80
      - 8443:443
    volumes:
      - ./:/var/www

  solr:
    image: image-url-solr:latest
    links:
      - db
    ports:
      - "8700:8700"
      - "8710:8710"
      - "8720:8720"
      - "8730:8730"
    restart: always

  db:
    image: image-url-db:latest
    ports:
      - "8032:5432"
    restart: always
    environment:
      POSTGRES_DB: dbName
      POSTGRES_USER: dbUser
      POSTGRES_PASSWORD: 'password'
      POSTGRES_INITDB_ARGS: '-E SQL_ASCII'
    volumes:
      - ./:/var/www/backups

  memcached:
    image: memcached:1.4.31
    restart: always

【问题讨论】:

    标签: docker-compose docker-volume


    【解决方案1】:

    根据您的屏幕截图,您的 Windows 系统上有一个 backups 目录。它似乎与您在运行 docker exec 命令时所在的目录处于同一级别(基于您示例中的 shell 提示符)。

    然而,重要的是容器内有什么可用。您使用 docker exec 运行的命令在您的容器内运行,而不是直接在您的 Windows 系统上运行。这里有问题的容器是db 服务,它在docker-compose.yml 中定义了一个卷挂载:

    db:
       volumes:
        - ./:/var/www/backups
    

    这将在容器内的/var/www/backups 挂载基目录(docker-compose.yml 所在的目录)。

    从您的屏幕截图中,我无法确定 docker-compose.yml 的位置,但您的命令文本示例表明它可能位于 ~/dockerProjectImage 中。这就是挂载在/var/www/backups 的目录。

    从那时起,您将无法访问屏幕截图中显示的backups 目录。它在dockerProjectImage 之外,所以它不会是挂载的一部分。

    解决此问题的一种方法是将backups 目录移动到dockerProjectImage 中。然后它将在容器内作为/var/www/backups/backups/ 可用。但是,这仍然无法按照您编写命令的方式(可能)因为您使用的是相对路径(backups/backup.psql)。您需要指定完整路径,例如

    docker-compose exec db pg_restore -U fewo -h localhost \
        --dbname=dbName /var/www/backups/backups/backup.psql
    

    【讨论】:

    • 我按照您上面提到的相同步骤进行操作。 /var/www/backups/backups/backup.psql 中的 / 假定为 C:/Program Files 并给出以下错误:$ docker-compose exec db pg_restore -U fewo -h localhost --dbname=dbName /var/www/backups/backups/dbName.psql pg_restore: [archiver] could not open input file "C:/Program Files/Git/var/www/backups/backups/dbName.psql": No such file or directory
    • @DeepakPathak 你的截图和问题没有提到任何关于`C:\Program Files`的内容,所以我无法告诉你那里发生了什么。我只是随机猜测,因为问题中没有关于该目录的任何信息。您可能需要为您的问题添加更多细节,以便人们提出可能的解决方案。
    • 只是为了让新人明白这一点:./:/var/www/backups 表示从 docker-compose 文件的目录 (.) 挂载到容器内的卷 (/var/www/backups)。您可以为该卷选择您喜欢的任何目录。例如,如果您希望在主目录的备份中看到该文件,则需要将其挂载到 /home/backups(不是:~/backups,需要绝对路径)。将转储的 db (".sql", ".dump", ...) 放在与 docker-compose 文件相同的目录中。如果您输入容器的 bash,您可以在 /var/www/backups~/backups 中找到它。
    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多