从另一个容器连接到postgresql容器(Docker)

cdmah0mi  于 2023-02-15  发布在  Docker
关注(0)|答案(4)|浏览(168)

我一直在尝试遵循这个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

现在我已经尝试将主机设置为databaselocalhost0.0.0.0,甚至容器IP,但没有任何效果,我不知道它应该是什么或如何调试它,我不100%确定docker-compose如何链接容器。

yqhsw0fo

yqhsw0fo1#

不要使用depends_on.用“链接”试试

version: '2'
    services:
      server:
        build: .
        ports:
          - 3030:3030
        links:
          - database
        #environment could be usefull too
        environment:
            DATABASE_HOST: 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

有关详细信息,请访问https://docs.docker.com/compose/compose-file/#links

0h4hbjxa

0h4hbjxa2#

可能是一个老线索回答,但我一直使用depends_on与以下docker-compose文件

version: '3.4'

volumes:
  postgres_data:
      driver: local

services:
  postgres:
      image: postgres
      volumes:
        - ./postgres_data:/var/lib/postgresql:rw
        - ./deployments:/opt/jboss/wildfly/standalone/deployments:rw
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: password
      ports:
        - 5432:5432
   keycloak:
      image: jboss/keycloak
      environment:
        POSTGRES_ADDR: postgres
        POSTGRES_DATABASE: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: Pa55w0rd
      ports:
        - 8080:8080
        - 9990:9990
      depends_on:
        - postgres
5kgi1eie

5kgi1eie3#

本教程跳过了一些内容,令人困惑的是,它提到了wait-for-it.sh脚本,但随后显示了一个非常简化的版本,如果将hostname:port作为一个参数传递给它,则该版本将无法工作。
我有一个裂缝在让这个工作,无论是对未来的我和其他人,我会添加以下步骤.我这样做的MacOS,并有两个docker和docker-compose安装以及nodejs.
我手边没有您的节点应用程序,因此我使用了此处所述的节点应用程序https://nodejs.org/de/docs/guides/nodejs-docker-webapp/
我有以下目录结构:

/src/package.json
/src/server.js
/.pgpass
/docker-compose.yml
/Dockerfile
/wait-for-postgres.sh

下面列出了这些文件的内容。
步骤
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文件与上面的节点js dockerize链接完全相同 *

/src/package.json

{
    "name": "docker_web_app",
    "version": "1.0.0",
    "description": "Node.js on Docker",
    "author": "First Last <first.last@example.com>",
    "main": "server.js",
    "scripts": {
      "start": "node server.js"
    },
    "dependencies": {
      "express": "^4.16.1"
    }
  }

/src/server.js

'use strict';

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello world\n');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

. pgpass

  • 这里使用用户名:密码postgres:postgres,纯粹用于开发演示目的。在野外,您将使用一些其他的机密管理方法,并且永远不会将pgpass文件提交给版本控制 *
#host:port:db:user:pass
db:5432:*:postgres:postgres

docker-compose.yml

  • 我已经添加了wait-for-postgres.sh脚本作为托管卷,在最初的问题中,它是与应用程序src捆绑在一起的,这很奇怪。
  • 我还在root用户的主目录中安装了.pgpass文件,psql将在其中查找自动密码完成。如果您没有提供此功能的方法,则会收到错误消息:

psql:发送数据:未提供密码

  • 请注意,server容器的命令引用的是database,它是postgres容器的有效docker-compose内部dns名称。
version: '2'
services:

  server:
    build: .
    ports:
      - 3030:3030
    depends_on:
      - database
    volumes:
      - ./wait-for-postgres.sh:/usr/app/setup/wait-for-postgres.sh
      - ./.pgpass:/Users/root/.pgpass
    command: ["/usr/app/setup/wait-for-postgres.sh", "database", "--", "node", "src"]

  database:
    image: postgres
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=postgres"
      - "POSTGRES_DB=tide_server"
    ports:
      - 5432:5432

停靠文件

  • 我已经从node js教程中修改了它,将它固定到Debian "buster"版本,并安装了该脚本所需的psql
FROM node:10-buster

RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
    wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

RUN apt-get -y update - && \
    apt-get -y install libpq-dev && \
    apt-get -y install postgresql-client-11

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

wait-for-postgres.sh

  • 我已经修改了脚本非常轻微,因为我运行了"shellcheck" linter,它抱怨了一些事情。我意识到这个脚本是从docker教程页面。
#!/bin/bash
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$*"

export PGPASSFILE=./pgpass

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"
brc7rcf0

brc7rcf04#

这里的问题是主机本身。

psql -h **"$host"** -U "<USER>" -c '\l'

您正在传递错误的主机名"localhost:5432" / "192.168.64.2:5432"
我所做的是设置一个~/.pgpass

localhost:5432:DB:USER:PASSWORD

并且省略端口,而不是传递"localhost:5432"
这对我很有效...

相关问题