我一直在尝试建立一个容器化节点.js-postgres服务并准备就绪。
由于我的应用程序(节点(容器在 postgres 容器完全设置并准备好接收连接之前已经启动,因此我使用了 wait-for-it.sh bash 脚本。
我的应用程序的 Dockerfile
FROM node:latest
WORKDIR /container
COPY wait-for-it.sh /usr/wait-for-it.sh
RUN chmod +x /usr/wait-for-it.sh
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5800
CMD ["npm", "start"]
docker-compose.yml:
version: '3.7'
services:
postgres:
container_name: postgres
image: mdillon/postgis
environment:
POSTGRES_PASSWORD: rndpassword
POSTGRES_USER: postgres
POSTGRES_DB: geogis
PGDATA: /pgdata
volumes:
- ./pgdata:/var/lib/postgresql/data
ports:
- '5432:5432'
web:
container_name: app
restart: always
build: .
ports:
- '5800:5800'
depends_on:
- postgres
command: bash -c "/usr/wait-for-it.sh --timeout=0 postgres:5432"
撰写文件似乎等待 postgres 容器完全设置,但 我得到"不完整的启动"日志。应用程序退出,我无法向应用程序发送请求。
$ docker-compose up
Creating network "testsrv_default" with the default driver
Creating postgres ... done
Creating app ... done
Attaching to postgres, app
postgres | The files belonging to this database system will be owned by user "postgres".
postgres | This user must also own the server process.
postgres |
postgres | The database cluster will be initialized with locale "en_US.utf8".
postgres | The default database encoding has accordingly been set to "UTF8".
postgres | The default text search configuration will be set to "english".
postgres |
postgres | Data page checksums are disabled.
postgres |
postgres | fixing permissions on existing directory /pgdata ... ok
postgres | creating subdirectories ... ok
postgres | selecting default max_connections ... 100
postgres | selecting default shared_buffers ... 128MB
postgres | selecting dynamic shared memory implementation ... posix
postgres | creating configuration files ... ok
app | wait-for-it.sh: waiting 15 seconds for postgres:5432
postgres | running bootstrap script ... ok
postgres | performing post-bootstrap initialization ... ok
postgres | syncing data to disk ... ok
postgres |
postgres | Success. You can now start the database server using:
postgres |
postgres | pg_ctl -D /pgdata -l logfile start
postgres |
postgres |
postgres | WARNING: enabling "trust" authentication for local connections
postgres | You can change this by editing pg_hba.conf or using the option -A, or
postgres | --auth-local and --auth-host, the next time you run initdb.
postgres | waiting for server to start....2020-06-27 14:11:00.734 UTC [41] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres | 2020-06-27 14:11:00.752 UTC [42] LOG: database system was shut down at 2020-06-27 14:10:59 UTC
postgres | 2020-06-27 14:11:00.758 UTC [41] LOG: database system is ready to accept connections
postgres | done
postgres | server started
postgres | CREATE DATABASE
postgres |
postgres |
postgres | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/postgis.sh
postgres | CREATE DATABASE
postgres | UPDATE 1
postgres | Loading PostGIS extensions into template_postgis
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres | Loading PostGIS extensions into geogis
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres | CREATE EXTENSION
postgres |
postgres | waiting for server to shut down...2020-06-27 14:11:04.527 UTC [41] LOG: received fast shutdown request
postgres | .2020-06-27 14:11:04.535 UTC [41] LOG: aborting any active transactions
postgres | 2020-06-27 14:11:04.537 UTC [41] LOG: background worker "logical replication launcher" (PID 48) exited with exit code 1
postgres | 2020-06-27 14:11:04.548 UTC [43] LOG: shutting down
postgres | 2020-06-27 14:11:05.083 UTC [41] LOG: database system is shut down
postgres | done
postgres | server stopped
postgres |
postgres | PostgreSQL init process complete; ready for start up.
postgres |
postgres | 2020-06-27 14:11:05.139 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres | 2020-06-27 14:11:05.139 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres | 2020-06-27 14:11:05.144 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres | 2020-06-27 14:11:05.158 UTC [87] LOG: database system was shut down at 2020-06-27 14:11:05 UTC
postgres | 2020-06-27 14:11:05.163 UTC [1] LOG: database system is ready to accept connections
postgres | 2020-06-27 14:11:05.727 UTC [94] LOG: incomplete startup packet
app | wait-for-it.sh: postgres:5432 is available after 7 seconds
postgres | 2020-06-27 14:11:06.125 UTC [95] LOG: incomplete startup packet
app | wait-for-it.sh: postgres:5432 is available after 0 seconds
app exited with code 0
postgres | 2020-06-27 14:11:06.643 UTC [96] LOG: incomplete startup packet
app | wait-for-it.sh: postgres:5432 is available after 0 seconds
app exited with code 0
postgres | 2020-06-27 14:11:07.358 UTC [97] LOG: incomplete startup packet
app | wait-for-it.sh: postgres:5432 is available after 0 seconds
app exited with code 0
postgres | 2020-06-27 14:11:08.485 UTC [98] LOG: incomplete startup packet
app exited with code 0
postgres | 2020-06-27 14:11:10.382 UTC [99] LOG: incomplete startup packet
app exited with code 0
postgres | 2020-06-27 14:11:13.895 UTC [100] LOG: incomplete startup packet
app exited with code 0
这种行为一直持续到我关闭容器为止。
我将不胜感激任何帮助。
你应该传递命令行来执行npm start
wait_for_it.sh
。
您现在拥有它的方式,只要wait-for-it.sh
可以打开与postgres:5432
的 tcp 连接,从而生成无害的"不完整启动数据包"日志消息,应用程序就会退出。
您希望wait_for_it.sh
在可以到达该端口时npm start
运行。
请在docker-compose.yml中尝试这样的事情:
/usr/wait-for-it.sh --timeout=0 postgres:5432 -- npm start
.