在Powershell下的后台运行docker
简单的问题,我想在后台运行docker命令。在Powershell下的后台运行docker,powershell,docker,background,execute,start-job,Powershell,Docker,Background,Execute,Start Job,简单的问题,我想在后台运行docker命令。 (实际上,在Powershell下使用命令行参数运行任何命令都是我真正的问题,但docker是一个简单而具体的问题) 我有命令 docker run -ti --rm -e DISPLAY=$DISPLAY firefox 在Powershell下运行良好,但会阻塞 我想在*nix下运行执行“&”的等效方法: docker run -ti --rm -e DISPLAY=$DISPLAY firefox & 我试过了 但这两种方法
(实际上,在Powershell下使用命令行参数运行任何命令都是我真正的问题,但
docker
是一个简单而具体的问题)
我有命令
docker run -ti --rm -e DISPLAY=$DISPLAY firefox
在Powershell下运行良好,但会阻塞
我想在*nix下运行执行“&”的等效方法:
docker run -ti --rm -e DISPLAY=$DISPLAY firefox &
我试过了
> ping google.com &
At line:1 char:17
+ ping google.com &
+ ~
The ampersand (&) character is not allowed.
> Start-Process "C:\Program Files\Docker\Docker\resources\bin\docker.exe" run -ti --rm -e DISPLAY=$DISPLAY firefox
Start-Process : Parameter cannot be processed because the parameter name 'e' is ambiguous. Possible
matches include: -ErrorAction -ErrorVariable.
At line:1 char:86
+ ... Files\Docker\Docker\resources\bin\docker.exe" run -ti --rm -e DISPLAY ...
+ ~~
+ CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameter,Microsoft.PowerShell.Commands.StartProcessCommand
试图将整个命令包装在启动进程{…}
中也不起作用
[更新/摘要]
被接受的答案有效(在我从命令行中删除“-ti
”之后),正如@nischay goyal所说,“请不要使用-it,因为它会打开终端并阻止它。”。我得到的错误是:
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
+ CategoryInfo : NotSpecified: (the input devic...d with 'winpty':String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName : localhost
- 因此,
可能不适合作为执行“Start Job
”的通用方式,例如,如果我想以这种方式启动&
bash&
- 但是,
在将所有剩余的Start进程
命令行参数作为单个字符串传递给docker
参数后工作-ArgumentList
- 当然,正如所有docker/Linux阵营的人所说,使用
-d
总之,有很多方法可以解决这个问题。挑一个适合你的 firefox命令不希望在stdin上有任何输入,也不需要tty。因此,请删除
-it
。接下来添加-d
,它代表分离模式、docker内部运行守护进程的标准方式或其他非交互式命令
docker run -d --rm -e DISPLAY=$DISPLAY firefox
firefox命令不希望在stdin上有任何输入,也不需要tty。因此,请删除
-it
。接下来添加-d
,它代表分离模式、docker内部运行守护进程的标准方式或其他非交互式命令
docker run -d --rm -e DISPLAY=$DISPLAY firefox
要在docker中在docker处于后台的情况下完全执行命令,可以使用:
docker run $YourOption $ImageDocker exec $yourCommand
不要使用-i-t选项,它会打开终端
做点像
docker run --rm -e DISPLAY=$DISPLAY firefox exec "ping google.com"
要在docker中在docker处于后台的情况下完全执行命令,可以使用:
docker run $YourOption $ImageDocker exec $yourCommand
不要使用-i-t选项,它会打开终端
做点像
docker run --rm -e DISPLAY=$DISPLAY firefox exec "ping google.com"
要在分离模式下运行docker容器,请不要使用
-it
,因为它会打开并阻止终端
docker run --rm -e DISPLAY=$DISPLAY firefox
要在PowerShell的后台运行该命令,只要该命令是可执行文件或具有关联可执行文件的文件,请使用Start Process(可从v2获得):
要在分离模式下运行docker容器,请不要使用
-it
,因为它会打开并阻止终端
docker run --rm -e DISPLAY=$DISPLAY firefox
要在PowerShell的后台运行该命令,只要该命令是可执行文件或具有关联可执行文件的文件,请使用Start Process(可从v2获得):
用于在PowerShell的后台运行命令。
在PowerShell[Core]6+中,您还可以将&
放在命令末尾,就像在类似POSIX的shell(如Bash)中一样
在这两种情况下,都会返回作业对象(System.Management.Automation.PSRemotingJob
),您可以使用各种*-job
cmdlet对其进行管理-请参阅
PowerShell中的作业类似于POSIX类Shell(如Bash)中的作业,但有一些基本区别,特别是无法在后台运行交互式命令-请参阅
后台作业使用在后台运行隐藏PowerShell实例的子进程,该进程速度慢且资源密集
因此,将基于线程的cmdlet视为更快、更轻的替代方案-请参阅
语法也适用于6以下的PowerShell版本,带有启动作业:
# Preferable alternative: Start-ThreadJob
$job = Start-Job { docker run --rm -e DISPLAY=$using:DISPLAY firefox }
$job = docker run --rm -e DISPLAY=$DISPLAY firefox &
注意:-ti
已被删除,因为如前所述,它将打开一个交互式shell会话,这意味着在手动关闭该会话之前,调用不会返回。然而,并不是说Start Job
通常不支持在后台运行交互式程序,就像
请注意,需要通过$using:
作用域说明符在调用方作用域中引用$DISPLAY
变量-请参阅
警告:在6.x之前的PowerShell版本中,以这种方式启动的后台作业使用了与调用方的无关的固定工作目录-请参阅
PowerShell[Core]6+备选方案:将和放在命令末尾:
# Preferable alternative: Start-ThreadJob
$job = Start-Job { docker run --rm -e DISPLAY=$using:DISPLAY firefox }
$job = docker run --rm -e DISPLAY=$DISPLAY firefox &
请注意,您不需要使用此语法的$using:
范围说明符,即使在PowerShell 6.x中,作业也会看到与调用方相同的工作目录
请注意,从PowerShell 7.0开始,还没有类似的简明语法用于创建线程作业(相当于启动ThreadJob
调用),但添加一个是本文的主题
如上所述,创建作业后,您可以使用各种其他
*-Job
cmdlet来管理作业(它们还可以管理使用启动ThreadJob
创建的线程作业);例如,以下命令同步等待作业完成,打印其输出,然后删除作业
$job | Receive-Job -Wait -AutoRemoveJob
至于你所尝试的:
ping google.com&
中的后置无效,因为您运行的是Windows PowerShell(PowerShell版本高达v5.1),而此语法需要PowerShell[Core]版本6或更高版本
用于异步启动可执行文件,默认情况下在新窗口中启动(在Windows上)。
它主要用于启动GUI应用程序(异步)或在新控制台窗口中运行shell命令
虽然它也可以无形地启动进程,但您对该进程几乎没有控制权,其输出只能通过文本文件间接捕获