我有一个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正在尝试连接到主机postgres实例,以及与主要目的是运行PostgreSQL的docker容器有关的其他问题。这是否准确,如果是这样,仍然可以运行主应用程序可访问的容器端PostgreSQL实例?
显然,将您的数据库与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
服务的容器的IP地址,这是postgres
映像容器。