docker 入口点脚本不会在 `trap` 函数中回显输出

问题描述 投票:0回答:0

我希望能够捕获一个 SIGINT,然后执行一个函数,然后使用 docker-compose 停止容器。

这是我的脚本

!/bin/bash

backup_dir="/backup"

# Define a function to handle the SIGTERM signal (graceful shutdown)
echo "[+] Postgres customer_entrypoint ran."

shutdown() {
    echo "[+] Backing up database before shutdown."
    pg_dumpall --on-conflict-do-nothing --column-inserts -U "$POSTGRES_USER" > "/backups/backup_$(date +%Y-%m-%d_%H-%M-%S).sql"
    pg_ctl -D "$PGDATA" -m fast -w stop
}

trap shutdown SIGINT
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
/usr/local/bin/docker-entrypoint.sh postgres &                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                               
wait $!

这是我的 docker-compose 文件:

version: '3.3'                                                                                                                                                                           
services:                                                                                                                                                                               
  postgres:                                                                                                                                                                            
    container_name: postgres                                                                                                                                                                  
    build:                                                                                                                                                                                     
      context: ./postgres                                                                                                                                                                                        
      dockerfile: Dockerfile-postgres.dev                                                                                                                                                                                          
    image: postgres-my:latest                                                                                                                                                                                                                                                                                                                                                                                                                        
    restart: always                                                                                                                                                                                           
    env_file:                                                                                                                                                                                             
      - ./.env.dev.db                                                                                                                                                                                             
    ports:                                                                                                                                                                                          
        - '127.0.0.1:5432:5432'                                                                                                                                                                                       
    volumes:                                                                                                                                                                                                                                                                                                                                                                                                                                        
      - ./postgres/backups:/backups                                                                                                                                                                                     
      - postgres_data_dev:/var/lib/postgresql/data                                                                                                                                                                                                                                                                                                                                                                        
    stop_signal: SIGINT                                                                                                                                                                       
                                                                                                                                                        
volumes:                                                                                                                                                                                          
    postgres_data_dev:

我使用 docker compose 以附加模式运行容器

sudo docker-compose -f docker-compose.dev up --build

我可以看到

[+] Postgres customer_entrypoint ran.
出现在 docker-compose 输出中,所以我知道脚本正在运行。如果我按 Ctrl-C,docker-compose 输出会立即显示这个

^CGracefully stopping... (press Ctrl+C again to force)
Stopping postgres  ... done

并且没有其他输出。但是我知道关闭功能在创建备份文件时运行。但是我想我会在上面的输出之前看到

[+] Backing up database before shutdown.

为什么我在 trap 函数中看不到任何 echo 输出?我该如何调整才能看到输出?主要问题是我也看不到 stderr,所以我不知道在更改代码时我的逻辑是否被破坏了。我该如何解决这个问题?

bash docker shell docker-compose entry-point
© www.soinside.com 2019 - 2024. All rights reserved.