【问题标题】:Setting up Dockerised command line application on Windows在 Windows 上设置 Dockerised 命令行应用程序
【发布时间】:2018-11-24 13:04:38
【问题描述】:

我正在向 Windows、OSX 和 Linux 用户分发命令行应用程序。应用程序的目标受众是开发人员、系统管理员和技术先进的用户。

我熟悉命令行工具和 Docker 在 Unix 上的工作方式。但是,我已经有 10 多年没有使用 Microsoft Windows 进行开发了。

我想这样当人们从命令提示符或 PowerShell 键入 app 时,docker 入口点将被执行,因为它是本机命令行应用程序。但是我不知道为 Windows 用户设置它的最佳方法是什么:我是否应该以某种方式在 PATH 中创建一个虚拟 EXE,我可以以某种方式为 Docker 启动起别名,或者 Docker for Windows 本身是否提供了一些工具来轻松运行图像而无需复杂的设置和配置文件进程。

为了使事情更复杂,对于app,我需要做一些虚拟卷映射,以便它可以从主机驱动器读取和写入文件,例如它可以处理为其提供的任何输入文件。它还将与已经在 Windows 上运行的 localhost 或外部 HTTP 服务器进行通信。

如何使app 顺利安装过程的最佳实践是什么,以便我将用户从冗长的命令行命令或复杂的配置过程中拯救出来,并且命令将在他们的默认命令行会话中可用?

我可以给用户一个线性命令来为他们设置app 和 Docker 镜像吗?

这是之前的问题,我该如何创建 Docker 镜像:

Containerising Python command line application

【问题讨论】:

    标签: windows powershell docker command-line alias


    【解决方案1】:

    我应该以某种方式在 PATH 中创建一个虚拟 EXE

    • 创建一个包装器批处理文件 (*.cmd) - cmd.exe 和 PowerShell 都能够像二进制可执行文件一样调用它 - 并将其放置在 %PATH% 中列出的目录之一中.

      • 但是,Windows 上没有标准化目录(而 Linux 有 /usr/bin 和 macOS /usr/local/bin),因此您的设置过程可能必须创建一个并使用 setx.exe 将其永久添加到 %PATH%
    • 使包装批处理文件按需执行设置,然后调用目标 Docker 映像,传递所有参数 (.*)。

    我可以给用户一个线性命令来为他们设置应用程序和 Docker 映像吗?

    您可以编写一个冗长的 PowerShell 命令来完成上述所有操作,或者使用更简单的引导命令来下载和执行在线存储的安装脚本。


    示例包装批处理文件app.cmd:

    @echo off
    setlocal
    
    set appName="%~n0"
    
    :: #  perform on-demand configuration...
    
    :: # Invoke the application in the target container.
    sudo docker run -it %appName%:0.1 %appName%.py %*
    

    【讨论】:

      【解决方案2】:

      如果您的应用程序使用近乎通用的脚本语言 (Python);您的用户目标是开发人员和系统管理员(他们可能已经安装了 Python);应用程序的一个关键部分是与非 Docker 主机文件和其他服务交互;那么您可能不是在寻找 Docker 容器。应用程序应该可以直接在主机上运行。

      Python 已经有了a fairly robust packaging system,我会依靠它作为您的主要分发机制。技术熟练的用户不会害怕

      python -m venv $HOME/myapp
      . $HOME/myapp/activate
      pip install myapp
      

      (请记住,Linux 的原生 Docker 需要 root 权限才能做任何事情;而 Mac/Windows 的 Docker 只能访问一些文件,一般“靠近”用户的主目录;联系主机和管理文件权限都是对于真正与主机一起工作但出于任何原因在 Docker 中运行的进程来说,这是一个棘手的问题。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 2010-10-15
        • 2023-03-10
        • 2021-10-25
        • 1970-01-01
        • 2011-06-12
        相关资源
        最近更新 更多