从脚本中分离 docker 运行 而不杀死容器

Detach from docker run from script without killing container

我有一个包含这一行的脚本:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 )

不过,即使我改成:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 </dev/null )

或:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 </dev/null ) </dev/null

甚至当我将整行放在单独的 shell 脚本中并将其包装在 nohup:

中时
nohup ./boot-container.sh

docker 如果脚本在后面一行被杀死(由 emacs),容器仍然会死掉。发生这种情况是因为 docker 客户端命令仍然是 运行,即使它的父级 PID 为 1,出于某种神秘的原因(可能是由于共享的 stdin 文件句柄 or tty) 当脚本被杀死时它也会被杀死,这反过来会导致它已经开始死亡的 docker 容器。我怎样才能避免这种情况?

在这种情况下,即使 nohup 也不够 - 必须使用 setsid:

fgrep -m 1 'PostgreSQL init process complete' <( setsid docker run --name test-postgres-migration \
                                                                   -a STDOUT -p 5432:5432 postgres:9.4 )

这解决了我在 Linux 上的问题 - 我还没有验证问题是否出现在 Mac 或 Unix 上,或者如果 this unofficial port of setsid 到 Mac 和其他 Unix修复它。