我一直在尝试遵循这个tutorial并设置一个postgresql容器。
我有以下脚本:
#!/bin/bash
# wait-for-postgres.sh
set -e
host="$1"
shift
cmd="$@"
until psql -h "$host" -U "postgres" -c '\l'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd
和下面的docker-compose.yml
:
version: '2'
services:
server:
build: .
ports:
- 3030:3030
depends_on:
- database
command: ["./setup/wait-for-postgres.sh", "localhost:5432", "--", "node", "src"]
database:
image: postgres
environment:
- "POSTGRES_USER=postgres"
- "POSTGRES_PASSWORD=postgres"
- "POSTGRES_DB=tide_server"
ports:
- 5432:5432
问题是,当我运行docker-compose up
时,我得到了以下错误:
server_1 | Postgres is unavailable - sleeping
server_1 | psql: could not translate host name "192.168.64.2:5432" to address: Name or servi
ce not known
server_1 | Postgres is unavailable - sleeping
server_1 | psql: could not translate host name "192.168.64.2:5432" to address: Name or servi
ce not known
server_1 | Postgres is unavailable - sleeping
server_1 | psql: could not translate host name "192.168.64.2:5432" to address: Name or servi
ce not known
现在我已经尝试将主机设置为database
、localhost
、0.0.0.0
,甚至容器IP,但没有任何效果,我不知道它应该是什么或如何调试它,我不100%确定docker-compose
如何链接容器。
4条答案
按热度按时间yqhsw0fo1#
不要使用depends_on.用“链接”试试
有关详细信息,请访问https://docs.docker.com/compose/compose-file/#links
0h4hbjxa2#
可能是一个老线索回答,但我一直使用depends_on与以下docker-compose文件
5kgi1eie3#
本教程跳过了一些内容,令人困惑的是,它提到了
wait-for-it.sh
脚本,但随后显示了一个非常简化的版本,如果将hostname:port
作为一个参数传递给它,则该版本将无法工作。我有一个裂缝在让这个工作,无论是对未来的我和其他人,我会添加以下步骤.我这样做的MacOS,并有两个docker和docker-compose安装以及nodejs.
我手边没有您的节点应用程序,因此我使用了此处所述的节点应用程序https://nodejs.org/de/docs/guides/nodejs-docker-webapp/
我有以下目录结构:
下面列出了这些文件的内容。
步骤
1.从
./src
目录运行$ npm install
(创建package-lock.json)1.使用
$ chmod 600 .pgpass
修复pgpass权限1.使脚本可执行
$ chmod +x wait-for-postgres.sh
1.从根目录
$ docker-compose up
它将提取postgres映像并构建节点应用容器,完成后它将等待postgres,当postgres启动时,你会看到它准备就绪。
文件
/src/package.json
/src/server.js
. pgpass
postgres:postgres
,纯粹用于开发演示目的。在野外,您将使用一些其他的机密管理方法,并且永远不会将pgpass文件提交给版本控制 *docker-compose.yml
wait-for-postgres.sh
脚本作为托管卷,在最初的问题中,它是与应用程序src捆绑在一起的,这很奇怪。.pgpass
文件,psql将在其中查找自动密码完成。如果您没有提供此功能的方法,则会收到错误消息:psql:发送数据:未提供密码
server
容器的命令引用的是database
,它是postgres容器的有效docker-compose内部dns名称。停靠文件
psql
。wait-for-postgres.sh
brc7rcf04#
这里的问题是主机本身。
您正在传递错误的主机名
"localhost:5432" / "192.168.64.2:5432"
我所做的是设置一个
~/.pgpass
并且省略端口,而不是传递
"localhost:5432"
。这对我很有效...