我希望能够捕获一个 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,所以我不知道在更改代码时我的逻辑是否被破坏了。我该如何解决这个问题?