docker-compose - 发出 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
.
如您所见,我已经尝试过在上面使用TRAP
andinit
但它无法删除_redirects
.
2020 年 11 月 25 日更新
还没有解决方案,但我发现如果我在另一个终端执行此操作:
docker kill -s hup frontend_1
它触发了陷阱并做我想做的事。但是使用-s int
or-s term
不做任何事情。
2020 年 11 月 26 日更新
我发现问题在于如何trap
netlify dev
. 如果我使用僵尸线,例如while true; do :; done
,停止 docker 服务,无论如何,除了纯kill
,将触发例程cleanup
。
老实说,一个exitpoint:
pragma indocker-compose.yml
将是我想要的。
解决方案
最后,通过修改以下内容对我有用entrypoint.sh
:
...
netlify dev | tee dev.log &
wait
推荐阅读
- scala - 通过在 azure databrick 中运行 head 命令导致的文字编号无效
- java - Set method for Java Calendar only works if I do a print of it
- lua - 为什么 Lua 表索引不能为零?
- amazon-web-services - 使用 AWS Go 开发工具包的动态清单
- python - 使用 pytest 对返回值的 void 方法进行单元测试
- git - 如何撤消 git restore 以取回更改
- flutter - 颤动的 ProgressDialog 似乎有影响所有实例的静态字段
- r - 如何合并具有对象名称中匹配字符的数据框?
- java - Java 泛型异常
- regex - Redshift psql regex如何匹配连续重复的数字?