首页 > 解决方案 > 发出 docker-compose stop 或 crtl-c 时如何运行关闭脚本

问题描述

我正在做:

docker-compose up

我的服务本质上是运行netlify dev

因为我们可能会处理多个_redirects_xxx文件,所以我的内容entrypoint.sh如下:

cleanup() {
    if $remove; then
        echo ">>> Removing created _redirects"
        rm -fv /app/_redirects
    else
        echo "Bye!"
    fi
}
reddoc=${1}
remove=false
if [ ! -s "/app/_redirects" ]; then
    echo ">>> Copying ${reddoc} to _redirects"
    cp /app/${reddoc} /app/_redirects
    remove=true
else
    echo ">>> _redirects already exists"
fi
trap 'cleanup' INT TERM EXIT
echo ">>> remove = ${remove}"
netlify dev

从我的docker-compose.yml,我有:

...
   frontend:
      volumes:
      - ./frontend/:/app
      - node_modules:/app/node_modules
...
      init: true
      command: bash ./entrypoint.sh _redirects_docker
...

关键是,一些开发人员有自己的_redirects文件,所以在启动 docker 服务时,我们不想覆盖他们的设置。但是对于所有其他开发人员(主要是后端人员),我们希望_redirects_docker发生,但是,当停止前端服务(例如crtl-C 或)时,如果文件从一开始就不存在docker-compose stop / down,我想要一个关闭步骤来删除文件_redirects.

如您所见,我已经尝试过在上面使用TRAPandinit但它无法删除_redirects.

2020 年 11 月 25 日更新

还没有解决方案,但我发现如果我在另一个终端执行此操作:

docker kill -s hup frontend_1

它触发了陷阱并做我想做的事。但是使用-s intor-s term不做任何事情。

2020 年 11 月 26 日更新

我发现问题在于如何trap netlify dev. 如果我使用僵尸线,例如while true; do :; done,停止 docker 服务,无论如何,除了纯kill,将触发例程cleanup

老实说,一个exitpoint:pragma indocker-compose.yml将是我想要的。

标签: docker-composeinitbash-trap

解决方案


最后,通过修改以下内容对我有用entrypoint.sh

...
netlify dev | tee dev.log &
wait

推荐阅读