我编写了一个使用postgres作为DB的简单服务器。当它没有使用docker时它正在工作,但当它使用docker compose进行dockerized和orchestrated时,我无法插入数据,因为table不存在。我确实检查了容器中的DB,它就在那里。
以下是我的设置,最后一个是错误。希望你们能找到我错过的东西。谢谢!
搬运工-compose.yml
db:
build: ./database
ports:
- "5432:5432" # Bind host port 5432 to PostgreSQL port 5432
web:
build: ./app
command: npm start
ports:
- "8080:8080"
links:
- db
- redis
environment:
DB_URL: "postgres://dockeruser:@db:5432/docker?encoding=unicode&schema=public"
volumes:
- ./app:/src/*
数据库初始化
CREATE USER dockeruser WITH PASSWORD 'docker';
CREATE DATABASE docker;
CREATE TABLE people ( id SERIAL, name TEXT, email TEXT );
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dockeruser
码
pg.connect(conString, function(err, client, done) {
client.query('INSERT INTO public."people" (name, email) VALUES ($1, $2) RETURNING id', row, function(err, result) {
//call `done()` to release the client back to the pool
done();
if (err) return reject(err);
// console.log(result.rows[0].id);
resolve(result.rows[0].id);
});
});
错误
db_1 | ERROR: relation "public.people" does not exist at character 13
db_1 | STATEMENT: INSERT INTO public."people" (name, email) VALUES ($1, $2) RETURNING id
web_1 | error { [error: relation "public.people" does not exist]
答案 0 :(得分:0)
您确定要调用您的数据库初始化脚本吗? postgresql docker使用/docker-entrypoint-initdb.d/*中的文件,如您在Dockerfile中所见:https://github.com/docker-library/postgres/blob/443c7947d548b1c607e06f7a75ca475de7ff3284/9.4/docker-entrypoint.sh#L77
您可以通过运行类似
的方式打开数据库来测试docker-compose up db
只会打开db容器,然后你可以将exec -it和psql停靠在postgres进程中,或者在5432上使用你公开的端口
此外,您可能希望按照Dockerfile期望的方式传递数据库,用户名和密码的初始化,如同在同一文件中看到的env变量
环境变量 PostgreSQL映像使用了几个容易遗漏的环境变量。虽然不需要任何变量,但它们可以显着帮助您使用图像。
POSTGRES_PASSWORD 建议您使用此环境变量来使用PostgreSQL映像。此环境变量设置PostgreSQL的超级用户密码。默认超级用户由POSTGRES_USER环境变量定义。在上面的示例中,它被设置为" mysecretpassword"。
POSTGRES_USER 此可选环境变量与POSTGRES_PASSWORD结合使用以设置用户及其密码。此变量将创建具有超级用户权限的指定用户和具有相同名称的数据库。如果未指定,则将使用postgres的默认用户。
POSTGRES_DB 此可选环境变量可用于为首次启动映像时创建的默认数据库定义其他名称。如果未指定,则将使用POSTGRES_USER的值。