postgresql - docker build 错误:psql:无法连接到服务器:连接被拒绝
问题描述
我的目标是使用其默认数据创建一个 docker 映像(postgres)。
所以我的计划是写一个 dockerfile,使用 base image postgres:11
,然后复制并在db0.sql
里面运行。
SQL 脚本:db0.sql
CREATE TABLE "quiz"."example" (
"name" varchar(255),
"age" int4,
"phone" varchar(255),
"blood_group" varchar(255),
"height" int4
);
INSERT INTO "quiz"."example" VALUES ('Tony', NULL, NULL, 'O', 180);
ALTER TABLE "quiz"."example" ADD CONSTRAINT "name" UNIQUE ("name");
dockerfile:db0.dockerfile
FROM postgres:11
COPY db0.sql /srv/
RUN /etc/init.d/postgresql start
RUN su postgres
EXPOSE 5432
RUN psql -U postgres -p 5432 -h localhost -f /srv/db0.sql
但是当我运行时docker build -t db0 -f db0.dockerfile .
,它向我显示以下错误:
Sending build context to Docker daemon 4.096kB
Step 1/6 : FROM postgres:11
---> 55ff21ffc6d1
Step 2/6 : COPY db0.sql /srv/
---> Using cache
---> 5623b274bfef
Step 3/6 : RUN /etc/init.d/postgresql start
---> Using cache
---> 838cd16f9545
Step 4/6 : RUN su postgres
---> Using cache
---> 2c65f67991f0
Step 5/6 : EXPOSE 5432
---> Using cache
---> a7921ebdf180
Step 6/6 : RUN psql -U postgres -p 5432 -h localhost -f /srv/db0.sql
---> Running in ddaced269112
psql: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Network is unreachable
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
The command '/bin/sh -c psql -U postgres -p 5432 -h localhost -f /srv/db0.sql' returned a non-zero code: 2
我不擅长 docker,但据我所知,错误似乎告诉我
当我尝试运行psql
命令时,但此时,postgres 服务还没有准备好使用?
现在,我的最终目标就像在终端中执行以下命令一样:
docker run -d -p 5432:5432 -v /srv/docker_data/db0:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres --name=db0 --restart=always postgres:11
docker cp db0.sql db0:/srv/
docker exec -it db0 bash
su postgres
psql -U postgres -p 5432 -h localhost -f /srv/db0.sql
完成这些之后,我可以使用 python_team 数据库、其中包含示例表的测验模式和其中的记录来连接到它。
如何解决?
解决方案
我找到了解决方案,按照这个
dockerfile:db0.dockerfile
FROM postgres:11
ENV POSTGRES_PASSWORD postgres
COPY db0.sql /docker-entrypoint-initdb.d/
官方 postgres 图像将运行内部找到的.sql脚本/docker-entrypoint-initdb.d/
然后运行docker run -d -p 5432:5432 -v /srv/docker_data/db0:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres --name=db0 db0
推荐阅读
- azure - 如何通过 Azure Policy 限制“发布者”
- visual-c++ - c++ 大括号初始化列表作为 lambda 参数
- apache-flink - 使用一次性一次性加入密钥的 Flink 加入流
- ios - 核心数据在更新和现有记录时创建空条目
- javascript - jquery中的on()事件输入
- powershell - 获取 TFS 2018 中所有已安装构建代理的列表
- pfx - 使用适当的 KeySpec 导出 PFX (Windows Server 2012 R2)
- python - 如何配置 Spyder 以处理大文件
- typescript - 如何在接口中设置枚举值?
- spring - yandex-qatools postgresql 嵌入式。是否需要在机器上安装 postgres?