将 wait-for-it.sh 与 docker 一起使用时启动数据包不完整



我一直在尝试建立一个容器化节点.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 startwait_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.

最新更新