在Powershell下的后台运行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 & 我试过了 但这两种方法

简单的问题,我想在后台运行docker命令。
(实际上,在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命令

虽然它也可以无形地启动进程,但您对该进程几乎没有控制权,其输出只能通过文本文件间接捕获