提问者:小点点

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


我一直在努力准备一个容器化的node.js-postgres服务。

由于我的app(node)容器在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"

compose文件似乎在等待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

这种行为一直持续到我关闭集装箱。

如果能给我任何帮助,我将不胜感激。


共1个答案

匿名用户

您应该将执行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