从脚本中分离 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修复它。
我有一个包含这一行的脚本:
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修复它。