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
。我会清理答案中的混乱