gpt4 book ai didi

powershell - 在Powershell下在后台运行docker

转载 作者:行者123 更新时间:2023-12-02 18:50:47 25 4
gpt4 key购买 nike

一个简单的问题,我想在后台运行docker命令。
(实际上,在Powershell下运行带有命令行参数的任何命令是我的真正问题,但是docker是一个简单的具体问题)

我有一个命令

docker run -ti --rm -e DISPLAY=$DISPLAY firefox

在Powershell下可以正常运行,但是会阻塞。

我想在* nix下运行执行“&”的等效方法:
docker run -ti --rm -e DISPLAY=$DISPLAY firefox &

我试过了
  • Run exe in background
  • Powershell equivalent of bash ampersand (&) for forking/running background processes

  • 但都不适合我:
    > 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


    试图将整个命令包装在 Start-Process { ... }中也不起作用。

    [更新/摘要]

    接受的答案有效(在我从命令行删除“ -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-Process命令行参数作为单个字符串传递给docker参数之后,-ArgumentList才能工作。
  • 当然,就像所有docker / Linux camp的人们所说的那样,请使用-d

  • 总而言之,有很多方法可以解决问题。选择一个适合您的。

    最佳答案

    使用 Start-Job 在PowerShell中在后台运行命令。

    在PowerShell [Core] 6+中,您也可以将&放在命令的末尾,就像在类似POSIX的shell(例如Bash)中一样。

    在这两种情况下,都将返回一个可以通过各种System.Management.Automation.PSRemotingJob cmdlet进行管理的作业对象(*-Job)-请参见about_Jobs

    PowerShell中的作业类似于类似POSIX的 shell (例如Bash)中的作业,但有一些基本差异,特别是无能在后台中运行交互式命令-请参见this comment on GitHub

    后台作业使用一个子进程,该子进程在后台运行一个隐藏的PowerShell实例,这很慢且占用大量资源。

    因此,将基于线程的 Start-ThreadJob cmdlet视为一种更快,更轻量的替代-请参阅this answer

    语法也可在低于6的PowerShell版本中使用Start-Job:

    # Preferable alternative: Start-ThreadJob
    $job = Start-Job { docker run --rm -e DISPLAY=$using:DISPLAY firefox }

    注意: -ti已删除,因为正如 Nischay Goyal指出的那样,它将打开一个交互式Shell session ,这意味着该调用只有在手动关闭该 session 后才会返回。但是,并不是 Start-Job通常不支持在后台运行交互式程序,例如 explained here

    注意,需要通过 $DISPLAY范围说明符在调用者的范围内引用 $using:变量-请参阅 about_Remote_Variables

    注意:在6.x以下的PowerShell版本中,以这种方式启动的后台作业使用了与调用者无关的固定工作目录-请参阅 this answer

    PowerShell [Core] 6+版本:将&放在命令的末尾:
    $job = docker run --rm -e DISPLAY=$DISPLAY firefox &

    请注意,您不需要使用此语法的 $using:范围说明符,即使在PowerShell 6.x中,该作业也会看到与调用方相同的工作目录。

    请注意,从PowerShell 7.0 起,还没有 用于创建线程作业的类似简洁语法(等效于Start-ThreadJob调用),但是添加一个是this feature request on GitHub的主题。

    如前所述,您可以使用其他各种*-Job cmdlet来管理创建后的作业(它们还管理使用Start-ThreadJob创建的线程作业);例如,以下命令同步等待作业完成,打印其输出,然后删除该作业。
    $job | Receive-Job -Wait -AutoRemoveJob

    至于您尝试了什么:
    &中的后置ping google.com &不起作用,因为您正在Windows PowerShell(PowerShell最高版本为v5.1)上运行,而此语法需要PowerShell [Core] 6或更高版本。

    Start-Process 设计为异步启动可执行文件,默认情况下在新窗口中(在Windows上)。
    它主要用于(异步)启动GUI应用程序或在新的控制台窗口中运行Shell命令。

    虽然它也可以隐式启动进程,但是您对该进程几乎没有控制,并且只能通过文本文件间接捕获其输出。

    调用失败的原因是您尝试将传递参数直接传递给Start-Process,而不是将其传递给-ArgumentList参数(在最简单的情况下,作为单个字符串)。

    关于powershell - 在Powershell下在后台运行docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60921436/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com