Postgresql 构建dockerfiile是可行的,但是从compose引用它并运行它会失败。不确定是否为dockerfile路径错误?

Postgresql 构建dockerfiile是可行的,但是从compose引用它并运行它会失败。不确定是否为dockerfile路径错误?,postgresql,docker,docker-compose,dockerfile,Postgresql,Docker,Docker Compose,Dockerfile,文件层次结构: |- docker-compose.yml |- database/ | |- Dockerfile | |- db_schema.sql 我有一个简单的Dockerfile,它将构建并运行 FROM postgres:10 ENV POSTGRES_USER=foo ENV POSTGRES_PASSWORD=password ENV POSTGRES_DB=foo COPY ./db_schema.sql /docker-entrypoint-initdb.d/

文件层次结构:

|- docker-compose.yml
|- database/
|  |- Dockerfile
|  |- db_schema.sql
我有一个简单的Dockerfile,它将构建并运行

FROM postgres:10

ENV POSTGRES_USER=foo
ENV POSTGRES_PASSWORD=password
ENV POSTGRES_DB=foo

COPY ./db_schema.sql /docker-entrypoint-initdb.d/

EXPOSE 5432
在复制的同一目录中有一个db_schema.sql文件。 这正如预期的那样有效

现在,我想用docker compose文件对此进行扩展

version: '2.0'
services:
    database:
        build: ./database/.
        ports: 
            - "5432:5432"

这似乎很简单。 现在的问题是,当我说
docker compose up
时,它将返回:

database_1  | Error: Database is uninitialized and superuser password is not specified.
database_1  |        You must specify POSTGRES_PASSWORD to a non-empty value for the
database_1  |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
database_1  | 
database_1  |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
database_1  |        connections without a password. This is *not* recommended.
database_1  | 
database_1  |        See PostgreSQL documentation about "trust":
database_1  |        https://www.postgresql.org/docs/current/auth-trust.html
backend_database_1 exited with code 1
但它们是在dockerfile中初始化的。环境变量是否需要在docker compose中设置,而不是在docker文件本身中设置

在查看时:
这是说docker compose负责dockerfile,但如果没有定义它们,它们只使用dockerfile环境变量。然而,这个错误仍然存在,这似乎让我很反感。

当我试图复制时,错误没有发生,问题中提供了确切的文件。真正的原因是一个旧的形象建立不正确

再现问题后进行编辑,图像有误:

要强制重建图像,可以使用以下命令:

docker-compose up --build
还可以在compose文件中提供环境变量:

 environment:
   - POSTGRES_USER=foo
   - POSTGRES_PASSWORD=password
   - POSTGRES_DB=foo

删除图像也可以解决问题。

我正在尝试复制,看看有什么问题。能否提供您正在使用的db_schema.sql的示例?它在我这方面起了作用,没有更改您提供的文件中的任何内容。我注释掉了db_schema.sql文件,因此它不是构建的一部分,以查看我是否仍然可以得到这个问题,而且它似乎也不起作用。我正在为你缩小范围。你是在Linux还是Windows上运行docker。我从我的机器中添加了结果。一切正常,在第一次尝试时,数据库未初始化时也正常。尝试删除图像,以强制将其删除rebuilt@NeoAnderson是否有方法进行docker compose清除或类似操作,因为我的Mac可能有问题?
docker image ls | grep postgres
,查找由compose文件生成的postgres图像,然后,
docker image rm
当尝试在compose中使用环境时,它会工作。在Dockerfile中执行此操作时,它不会。有趣。图像在某个时间点的构建方式一定有所不同,可能没有VAR。尝试
docker组合--构建
。这将强制重新过滤映像,
--构建
工作!我猜这是在保留和重用以前构建的映像。这是站不住脚的,但它已经开始起作用了。谢谢你,尼奥。如果你能在你的答案中添加构建,我会让你相信我们发现了问题。如果设置了不同的项目名称,还可以强制以不同的名称构建映像:
docker compose-p new name up
。我会清理答案中的混乱