Node.js 如何连接节点docker容器和postgres docker容器
我有一个CRUD应用程序在节点上工作,在我的本地机器上。它运行在node上,以postgres作为数据库,使用knex.js作为查询生成器等 我创建了一个docker文件和一个docker compose文件,容器开始运行,但节点容器无法到达postgres容器。我怀疑这与环境变量有关,但我不确定。这是我的docker文件:Node.js 如何连接节点docker容器和postgres docker容器,node.js,postgresql,docker,docker-compose,Node.js,Postgresql,Docker,Docker Compose,我有一个CRUD应用程序在节点上工作,在我的本地机器上。它运行在node上,以postgres作为数据库,使用knex.js作为查询生成器等 我创建了一个docker文件和一个docker compose文件,容器开始运行,但节点容器无法到达postgres容器。我怀疑这与环境变量有关,但我不确定。这是我的docker文件: FROM node:12 # Create app directory WORKDIR /usr/src/app # Install app dependencies #
FROM node:12
# 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 ci --only=production
# Bundle app source
COPY . .
ENV PORT=8080
EXPOSE 8080
CMD [ "npm", "start" ]
这是docker compose文件:
version: '2'
services:
postgres:
image: postgres:alpine
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: app
POSTGRES_DB: db
app:
build: .
depends_on:
- "postgres"
links:
- "postgres"
environment:
DB_PASSWORD: 'password'
DB_USER: 'app'
DB_NAME: 'db'
DB_HOST: 'postgres'
PORT: 8080
ports:
- '8080:8080'
command: npm start
另外,下面是根目录上的knex.js
文件,它根据环境处理db连接:
// Update with your config settings.
module.exports = {
development: {
client: 'pg',
connection: 'postgres://localhost/db'
},
test: {
client: 'pg',
connection: 'postgres://localhost/test-db'
}
};
此外,当我检查docker中节点应用程序上的hosts文件时,我没有看到任何提到postgres容器链接的内容。感谢您的帮助。Docker compose将创建一个内部网络,供其启动的不同容器共享。
由于
app
和postgres
是两个独立的容器,因此它们被视为两个主机。这会使应用程序在指向localhost
而不是postgres容器时,在同一容器上查找postgres
您可以通过在
knex.js
文件中使用postgres
更改localhost
来解决此问题。节点应用程序未连接的原因是,当您引用localhost
时,它正试图连接到自身。您的数据库位于非本地的第二个容器中,因此您需要通过服务名称(即postgres
)来引用它
因此,假设您的应用程序以另一种方式处理身份验证,您的配置如下:
// Update with your config settings.
module.exports = {
development: {
client: 'pg',
connection: 'postgres://postgres/db'
},
test: {
client: 'pg',
connection: 'postgres://postgres/test-db'
}
};
如果可以,您应该使用分配给
应用程序容器的环境变量。谢谢,这就是我的想法,但我不确定如何更新连接文件。我将尝试您建议的编辑。假设这是可行的,那么理论上我可以从节点容器运行迁移,它应该像平常一样迁移/种子化数据库?看起来docker文件会将整个源代码复制到映像中,所以只需确保运行docker compose build
然后docker compose down;docker compose up-d
,它将更新新文件。您可以通过docker compose exec app cat/path/to/knex.js
验证它是否有编辑。是的,只要您成功建立了连接,您的迁移就应该可以工作。也就是说,我没有看到您将任何凭据传入连接字符串的任何位置,因此可能需要首先修复。我确实尝试从连接字符串传递凭据,但我认为格式错误,因为我遇到了一些奇怪的错误。我正在寻找文档来告诉我字符串的格式应该是什么样的,如果我不能很快找到它,你能告诉我正确的格式是什么吗?我假设我需要从docker compose
文件中传递凭据?我最终还是让它工作了,connection:'postgres://app:password@postgres/db'
现在我需要弄清楚如何在docker composeGood中添加第二个测试数据库。不过,我不认为可以使用开箱即用的入口点创建第二个db。您可能需要手动创建或修改入口点(例如,)。