Docker (compose) : 让 knex 与 postgres 一起工作
Docker (compose) : making knex work with postgres
我正在尝试 docker 化 NodeJS / PostgreSQL 应用程序,但我无法 运行 knex
迁移,我收到以下错误:
Error: connect ECONNREFUSED 172.18.0.2:15432
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1161:14)
这是我的 docker-compose.yml :
version: "3"
services:
app:
build: .
depends_on:
- db
links:
- db
ports:
- "3000:3000"
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: users-microservice
DB_HOST: db
db:
image: postgres:10.4-alpine
expose:
- "5432"
ports:
- "15432:5432"
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: users-microservice
Docker文件 'app' 服务:
FROM node:10.1-alpine
EXPOSE 3000 9229 15432
COPY . /home/app
WORKDIR /home/app
RUN npm install
RUN npm install -g knex
CMD ./scripts/start.sh
并且在 start.sh 中,以下命令有效:
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$DB_HOST" -U "$POSTGRES_USER" -c '\d'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
所以我可以通过 CLI 连接到 postgres,但 knex 不能,这是为什么?我是不是弄错了什么,我是 Docker 的新手?
此致,
当您看到此错误消息(但也许您可以指定)时,我假设您正在尝试 运行 服务内的命令 app
?
那么我的猜测是您正试图从 app
内连接到 db:15432
。请注意,这句话
ports:
- "15432:5432"
仅确保您可以从端口 15432
上的 host 计算机调用该服务。但是如果你想从 app
中调用服务 db
,你仍然必须使用 db:5432
.
@the-bass 的回答救了我。我将包括我的 docker-compose.yml 和 knexfile.js 文件,希望让遇到这个问题的人更清楚地找到这个 post。
我做错的是我没有在我的应用程序容器中正确设置主机环境变量。一旦我将其更改为仅使用 db(我的 postgres 容器的名称)并确保将端口包含在我的 knexfile 中,一切正常。
knexfile.js
require("dotenv").config();
module.exports = {
development: {
client: "pg",
connection: {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
directory: "./data/migrations",
},
},
production: {
client: "pg",
connection: {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
directory: "./data/migrations",
},
},
};
docker-compose.yml
version: "3.7"
services:
db:
image: postgres:12.2
restart: always
ports:
- 5432:5432
volumes:
- my-postgres-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=me
- POSTGRES_PASSWORD=password
- POSTGRES_DB=my-data
node-app:
image: node:12.16.2
command: sh -c "npm install && npm install -g knex && knex migrate:latest && npm start"
ports:
- 3001:3001
working_dir: /home/node/app
volumes:
- ./:/home/node/app
environment:
- NODE_ENV=development
- DB_HOST=db
- DB_USER=HG
- DB_PASSWORD=password
- DB_DATABASE=my-data
depends_on:
- db
links:
- db
volumes:
my-postgres-data:
我正在尝试 docker 化 NodeJS / PostgreSQL 应用程序,但我无法 运行 knex
迁移,我收到以下错误:
Error: connect ECONNREFUSED 172.18.0.2:15432
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1161:14)
这是我的 docker-compose.yml :
version: "3"
services:
app:
build: .
depends_on:
- db
links:
- db
ports:
- "3000:3000"
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: users-microservice
DB_HOST: db
db:
image: postgres:10.4-alpine
expose:
- "5432"
ports:
- "15432:5432"
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: users-microservice
Docker文件 'app' 服务:
FROM node:10.1-alpine
EXPOSE 3000 9229 15432
COPY . /home/app
WORKDIR /home/app
RUN npm install
RUN npm install -g knex
CMD ./scripts/start.sh
并且在 start.sh 中,以下命令有效:
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$DB_HOST" -U "$POSTGRES_USER" -c '\d'; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
所以我可以通过 CLI 连接到 postgres,但 knex 不能,这是为什么?我是不是弄错了什么,我是 Docker 的新手?
此致,
当您看到此错误消息(但也许您可以指定)时,我假设您正在尝试 运行 服务内的命令 app
?
那么我的猜测是您正试图从 app
内连接到 db:15432
。请注意,这句话
ports:
- "15432:5432"
仅确保您可以从端口 15432
上的 host 计算机调用该服务。但是如果你想从 app
中调用服务 db
,你仍然必须使用 db:5432
.
@the-bass 的回答救了我。我将包括我的 docker-compose.yml 和 knexfile.js 文件,希望让遇到这个问题的人更清楚地找到这个 post。
我做错的是我没有在我的应用程序容器中正确设置主机环境变量。一旦我将其更改为仅使用 db(我的 postgres 容器的名称)并确保将端口包含在我的 knexfile 中,一切正常。
knexfile.js
require("dotenv").config();
module.exports = {
development: {
client: "pg",
connection: {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
directory: "./data/migrations",
},
},
production: {
client: "pg",
connection: {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
directory: "./data/migrations",
},
},
};
docker-compose.yml
version: "3.7"
services:
db:
image: postgres:12.2
restart: always
ports:
- 5432:5432
volumes:
- my-postgres-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=me
- POSTGRES_PASSWORD=password
- POSTGRES_DB=my-data
node-app:
image: node:12.16.2
command: sh -c "npm install && npm install -g knex && knex migrate:latest && npm start"
ports:
- 3001:3001
working_dir: /home/node/app
volumes:
- ./:/home/node/app
environment:
- NODE_ENV=development
- DB_HOST=db
- DB_USER=HG
- DB_PASSWORD=password
- DB_DATABASE=my-data
depends_on:
- db
links:
- db
volumes:
my-postgres-data: