我在it模式下运行docker容器,并调用shell脚本,应该在给定的IP地址创建Postgres数据库。例如,在容器外部,我调用./create_database localhost
,它正确地创建了一个连接到本地主机ip的数据库。
在docker容器中,然而,我运行./create_database <container name>
,它正确地转换为容器的主机ip,但它返回错误psql: connection to server at <container name> (xxx.xx.x.x), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections
。
我不知道为什么它在docker容器外工作,但不在容器内,是否有一些设置我必须为容器ip接受连接?我知道如果我想从外部访问容器,我必须发布端口,但这没有帮助。我还尝试创建一个网络并将其连接到容器,以尝试在网络ip上运行数据库,但这也不起作用。
我的dockerfile很简单:
FROM Postgres:11
COPY . .
USER postgres
ENTRYPOINT [“bash”, “-c”]
我的(绝对错误)env文件是:
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=localhost
POSTGRES_PORT_LOCAL=5432
这几乎肯定是完全错误的,但是在没有env文件的情况下运行它不会改变任何东西,所以我认为这无关紧要。
我正在运行我的代码与docker run -it —name database —network net —rm —env-file path/to/.env database bash
我对docker相当陌生,所以如果我遗漏了任何重要信息,请告诉我,我会添加所有我能添加的信息。
编辑:这是linux 20.10.17的docker
有两种方法可以做到这一点,这取决于您是想从主机还是容器运行您的安装脚本。
无论哪种方式,运行未修改的postgres:11
映像。您的ENTRYPOINT
行可能会导致问题,并且您的docker run
命令尝试运行交互式shell而不是数据库服务器。
第一种方法是使用已发布的端口运行数据库容器。然后,您可以在容器外部按原样运行脚本。
docker run -d -p 5432:5432 postgres:11
./create_database localhost
如果你已经在主机上运行一个PostgreSQL实例,并且这个冲突,将第一个端口号更改为任何其他端口(第二个必须是标准端口5432),并在脚本中更改端口号,可能使用标准PGPORT
环境变量。
docker run -d -p 12345:5432 postgres:11
export PGPORT=12345
./create_database localhost
第二个选项是在容器中运行脚本。我可以为这个
创建一个专用的图像FROM ubuntu:20.04
RUN apt-get update
&& DEBIAN_FRONTEND=noninteractive
apt-get update --no-install-recommends --assume-yes
postgresql-client
COPY create_database /usr/local/bin
CMD echo "usage: create_database [hostname]" >&2; exit 1
现在你需要在同一个Docker网络上启动数据库容器和脚本,并使用数据库容器的名称作为主机名。
docker build -t create-database .
docker create network somenet
docker run -d --name database --net somenet postgres:11
docker run --rm --net somenet create-database
create_database database
如果您使用的是docker -for mac或docker -for windows 18.03+,只需使用host.docker.internal连接到您的mysql服务(而不是在您的连接字符串中的127.0.0.1)
如果你使用的是Docker-for- linux20.10.0 +,如果你用——add-host host. Docker .internal:host-gateway选项启动Docker容器,你也可以使用host host. Docker .internal。