使用Docker Compose创建Postgres表和模式

3
最初的回答: 我正在尝试使用docker-compose文件创建包含模式和表的Postgres数据库。 我已经阅读了一些关于这个主题的帖子并尝试了建议的解决方案:将.sql文件通过卷复制到/docker-entrypoint-initdb.d/中,因为它们应该会被执行。
我的docker-compose文件如下:
  postgres_db:
       image: postgres:latest
       hostname: postgres-db
       container_name: postgres
       expose:
         - "5432"
       ports:
         - "5432:5432"
       networks:
         - default
       environment:
         - "POSTGRES_PASSWORD=password"
         - "POSTGRES_USER=postgres"
         - "POSTGRES_DB=postgres"
       volumes:
         - ./scripts/postgres:/docker-entrypoint-initdb.d/

/scripts/postgres中的文件包括:

最初的回答

1-schema.sql

CREATE SCHEMA myschema;


2-table.sql

CREATE TABLE myschema.mytable(id integer PRIMARY KEY, purchase_date date, unit integer, description varchar(300));


最初的回答:我遇到了以下错误:
翻译内容:

我遇到了以下错误:

postgres       | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/1-schema.sql
postgres       | psql:/docker-entrypoint-initdb.d/1-schema.sql:0: could not read from input file: Is a directory
postgres exited with code 1

最初的回答中提到了定义卷的尝试,具体方法如下:

同时我尝试将卷定义为:

       volumes:
         - ./scripts/postgres/1-schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
         - ./scripts/postgres/2-table.sql:/docker-entrypoint-initdb.d/2-table.sql

但仍然出现相同的错误:(

有任何建议关于为什么会失败和可能的修复方法吗?

编辑: @Mihai,似乎没有名为1-schema.sql的文件夹。以下是建议命令的输出:

Original Answer翻译成:"最初的回答"

$ ls -lart ./scripts/postgres
total 16
-rw-r--r--@ 1 user  staff   26 13 may 22:21 1-schema.sql
-rw-r--r--@ 1 user  staff  152 13 may 22:21 2-table.sql
drwxr-xr-x  4 user  staff  128 13 may 22:43 .
drwxr-xr-x  9 user  staff  288 13 may 22:50 ..

$ cat ./scripts/postgres/1-schema.sql
CREATE SCHEMA myschema;
$ cat ./scripts/postgres/2-table.sql
CREATE TABLE myschema.mytable(id integer PRIMARY KEY, purchase_date date, unit integer, description varchar(300));

最初的回答

提前感谢!


我重新创建了你的示例,它完美地运行了。你是在Windows上吗?因为这可能是一个文件格式问题。 - undefined
@Mihai 谢谢你的回复。我正在 OS X 上执行它。 我正在执行以下命令: docker-compose down docker-compose build docker-compose up - undefined
@Mihai,我也按照你说的尝试重命名文件,但没有成功: $ ls -lart ./scripts/postgres 总计 16 -rw-r--r--@ 1 user staff 26 5月 13 22:21 01_schema.sql -rw-r--r--@ 1 user staff 152 5月 13 22:21 02_table.sql drwxr-xr-x 9 user staff 288 5月 13 22:50 .. drwxr-xr-x 4 user staff 128 5月 14 19:21 .. Docker Compose 中的卷为: - ./scripts/postgres/01_schema.sql:/docker-entrypoint-initdb.d/01_schema.sql - ./scripts/postgres/02_table.sql:/docker-entrypoint-initdb.d/02_table.sql - undefined
但是相同的结果:postgres | /usr/local/bin/docker-entrypoint.sh: 正在运行 /docker-entrypoint-initdb.d/01_schema.sql postgres | psql:/docker-entrypoint-initdb.d/01_schema.sql:0: 无法从输入文件中读取:是一个目录 postgres 退出,代码为 1 - undefined
抱歉,这是对你之前关于尝试将1-schema.sql重命名为01_schema.sql的评论的回答。我现在会尝试删除并创建文件,看看@字符是否消失。我会告诉你的。非常感谢你的帮助! - undefined
显示剩余2条评论
3个回答

4

我通过创建一个实际文件夹来复现了您的问题:

mkdir ./scripts/postgres/0-schema.sql
docker-compose up

然后我得到了与您完全相同的错误:
postgres       | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/0-schema.sql
postgres       | psql:/docker-entrypoint-initdb.d/0-schema.sql:0: could not read from input file: Is a directory

请仔细检查您的本地设置,因为您的 "scripts/postgres" 文件夹中可能有一个名为1-schema.sql的文件夹。

通过在项目文件夹中运行以下命令来检查:

ls -lart ./scripts/postgres

似乎没有名为1-schema.sql的文件夹,将该命令的输出添加到帖子中(太长无法作为评论添加)。谢谢! :) - undefined
我能看到的唯一问题是末尾的'@'字符:"-rw-r--r--@"。这表示扩展属性,你可以通过运行"ls -lart@"来查看它们。但在此之前,你能否重新创建文件,以使"@"符号消失?这可能会导致文件在Linux中显示为目录...所以请删除这些文件,并使用vim或其他文本编辑器重新创建它们。 - undefined
所有文件如下:$ docker-compose -f docker/docker-compose.yml run postgres_db ls -lart /docker-entrypoint-initdb.d 总计 4 drwxr-xr-x 2 root root 64 5月 13 21:08 2-table.sql drwxr-xr-x 2 root root 64 5月 13 21:08 1-schema.sql drwxr-xr-x 2 root root 64 5月 14 17:32 02_table.sql drwxr-xr-x 2 root root 64 5月 14 17:32 01_schema.sql drwxr-xr-x 6 root root 192 5月 14 17:32 . drwxr-xr-x 1 root root 4096 5月 14 18:16 .. - undefined
是的...看起来是这样的...它们是空的: $ docker-compose -f docker/docker-compose.yml run postgres_db ls -lart /docker-entrypoint-initdb.d/02_table.sql 总计 0 drwxr-xr-x 6 root root 192 May 14 17:32 .. drwxr-xr-x 2 root root 64 May 14 17:32 .$ docker-compose -f docker/docker-compose.yml run postgres_db ls -lart /docker-entrypoint-initdb.d/01_schema.sql 总计 0 drwxr-xr-x 6 root root 192 May 14 17:32 .. drwxr-xr-x 2 root root 64 May 14 17:32 .在本地,我有那些文件,但是作为文件而不是目录。 - undefined
我看到了 :D 现在它正在正确执行!!非常感谢你在故障排除中提供的帮助:)只是为了确认一下(因为我对 Docker 还很新),最佳实践是始终从包含 docker-compose.yml 文件的文件夹中执行 docker-compose,对吗?如果我想使用 -f 标志,我需要在本地主机上使用脚本的绝对路径来编写卷吗? - undefined
显示剩余5条评论

1
我今天遇到了类似的问题,以下是我解决的方法:
  1. 运行docker-compose -f <file-name.yml> config命令查看实际挂载的路径。

  2. 检查这些路径下的脚本是否可访问。如果你在一个Docker容器内运行另一个Docker容器(例如使用Jenkins构建项目),请使用其bash命令检查文件是否可访问。

在我的情况下,这些文件是不可访问的。我更改了路径后问题得到解决。


0

我本地创建了一个文件夹,导致冲突。一旦我将其从项目结构中移除,错误就消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接