【发布时间】:2019-12-24 13:16:33
【问题描述】:
这一切都从article 开始,关于在 docker 中设置 nginx 和 certbot。在手册的最后作者使用以下命令为 nginx 自动更新证书:
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
我不是唯一不了解这部分的人,所以有一个关于SO的问题:Why do sleep & wait in bash?
给出的答案是原始命令并不完美,这里是更正的版本:
/bin/sh -c 'nginx -g \"daemon off;\" & trap exit TERM; while :; do sleep 6h & wait $${!}; nginx -s reload; done'
但是在这个命令中我看到nginx -g \"daemon off;\" &
为什么我们先把 nginx 放在前台,然后把它塞到后台呢?有什么影响,为什么不首先在后台启动 nginx?
另一个问题:据我了解,与原始命令不同,while 循环停留在 docker 的前台。但是如果nginx如果是后台,是不是就意味着如果死掉了,docker就不管了?在前台while 还在工作,没问题。
最后一个问题:为什么在这个命令中有时会看到$${!},有时会看到${!}。来自同一个 SO 问题的${!} 示例:
docker run --name test --rm --entrypoint="/bin/sh" nginx -c 'nginx -g "daemon off;" & trap exit TERM; while :; do sleep 20 & wait ${!}; echo running; done'
我知道这是一个字符转义,但我不知道这种情况的规则。
【问题讨论】: