通过容器端Node.js Web应用访问容器端Postgres数据库

时间:2019-04-12 19:06:17

标签: node.js postgresql docker

我有一个Node.js应用程序的Dockerfile,总体看起来像这样:

FROM ubuntu
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

WORKDIR /app
COPY . /app

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y -q --no-install-recommends \
        apt-transport-https \
        build-essential \
        ca-certificates \
        curl \
        git \
        libssl-dev \
        wget \
        postgresql-10 postgresql-client-10 postgresql-contrib-10

USER postgres
RUN    /etc/init.d/postgresql start &&\
    psql --command "CREATE USER warbler WITH SUPERUSER;" &&\
    createdb -O warbler warbler_store

# ... node setup stuff ...
# ...
# ...

RUN psql -U warbler -d warbler_store -f db_v1.sql

CMD ["node", "index.js"]

尽管如此,我得到以下错误消息:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我已经在网上闲逛了一圈,发现的大多数解决方案似乎都在说docker试图连接到 host postgres实例,以及其他与之相关的问题主要目的是运行PostgreSQL的docker容器。这样准确吗?如果可以,那么仍然可以运行可由主应用程序访问的容器端PostgreSQL实例?

1 个答案:

答案 0 :(得分:0)

显然,将数据库与Web应用程序放在同一个Docker容器中不是一个好习惯。我只是通过在另一个容器中使用postgresql:10图像并让Web应用程序通过docker-compose与之通信来更改了容器结构。 docker-compose允许定义服务,而Docker的内部DNS将允许它们相互通信

docker-compose.yaml的外观如下:

version: '3'
services:
    web:
        build: .
        ports:
        - "3000:3000"
        volumes:
        - .:/app
        links:
        - db

    db:
        image: postgres:10
        environment:
        - POSTGRES_USER=warbler
        - POSTGRES_DB=warbler_store
        volumes:
        - ./db_v1.sql:/docker-entrypoint-initdb.d/db_v1.sql
        - dbdata:/var/lib/postgresql/data

volumes:
    dbdata:

在这种情况下,在web的Dockerfile中,我设置了必要的环境变量,以便Node连接到运行在postgresql://db:5432/warbler_store的数据库。 db通过DNS解析为运行db服务的容器(即postgres图像容器)的IP地址。