轻松访问Windows Docker容器上的文件

时间:2018-08-07 19:29:12

标签: docker ssh

摘要

因此,我正在尝试找到一种使用docker的方法,以便能够轻松地为客户启动测试环境。基本上,我有一个要安装到Windows docker容器(microsoft / windowsservercore)的自定义软件,并且我需要能够以以下方式访问该软件的程序文件夹(C:\ Program Files \ SOFTWARE_NAME)它具有一些日志,导入/导出以及其他各种配置文件。安装部分很容易,我发现在与docker纠缠了几个小时并了解了它的工作原理后,事实证明,以简单的方式传输文件比我想象的要困难得多。我很清楚docker cp命令,但是我希望可以在文件浏览器中查看文件,以使测试人员可以快速/轻松地从容器中查看日志/配置文件。

背景(我已经尝试过):

我花了20多个小时在docker容器上运行SSH服务器,所以我只能ssh并来回移动文件,但是我没有运气。我花了大部分时间尝试配置OpenSSH,并且可以将其安装,但是安装随附的默认配置文件似乎出了点问题,因为除非启动,否则无法启动并运行它通过运行sshd -d通过命令行手动进行操作。奇怪的是,这运行得很好,但是它实际上不是可行的解决方案,因为它以调试模式运行,并在连接关闭后立即关闭。我可以提供关于此测试内容的更多详细信息,但似乎这可能是死路一条(即使我觉得这应该非常简单)。我遵循了我能找到的所有指南(尽管有一半是特定于linux容器的,但还没有使它们奏效,而我发现的一半帖子只是说:“为什么当您使用ssh时,可以只使用内置的docker命令”。我想使用ssh,因为从最终用户的角度来看它更简单,我宁愿告诉测试人员ssh使用特定的IP,而不是让他们通过命令行与docker交互。

编辑:使用OpenSSH

使用net start sshd启动服务器,该服务器报告服务器已成功启动,但是,如果我至少没有使用以下方法生成RSA或DSA密钥,则该服务将立即停止:

ssh-keygen.exe -f "C:\\Program Files\\OpenSSH-Win64/./ssh_host_rsa_key" -t rsa

并使用以下命令修改权限:

icacls "C:\Program Files\OpenSSH-Win64/" /grant sshd:(OI)(CI)F /T

icacls "C:\Program Files\OpenSSH-Win64/" /grant ContainerAdministrator:(OI)(CI)F /T

同样,我使用的是默认提供的sshd_config文件,但是我已经尝试过对我可以找到的那些设置进行的每次调整,但它们都无济于事。

我也尝试设置Volumes来执行此操作,但是由于我们的软件安装是在docker上编译时完成的,因此我要映射为卷的文件夹已经装有文件,这似乎使docker失败当我尝试使用附加的卷启动容器时。文档的This部分似乎说这应该可行,但我无法使其正常工作。当我尝试启动容器时说“目录不为空”时,总是会出错。

编辑:使用的命令:

docker run -it -d -p 9999:9092 --mount source=my_volume,destination=C:/temp my_container

ProxMox VM上运行它。

在这一点上,我的想法已经用光了,我觉得应该非常简单的事情使我花了太多时间去弄清楚。我看到如此多的博客帖子说“只使用内置的docker cp命令!”尤其让我感到沮丧。老实说,当您要浏览大量文件并查看/编辑它们时,这是一个非常糟糕的解决方案。我确实需要一种允许在文件浏览器/ notepad ++中查看文件的方法。

这里是否有明显的我想念的东西?这有多难?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

因此,经过更多的故障排除后,即使documentation认为应该可以,也无法使Docker卷在已经填充的文件夹上进行初始化。

因此,我改为尝试尝试使用链接到一个空文件夹的卷来启动该容器,然后在容器运行后启动该程序的安装脚本,以便在该卷已经链接之后填充该文件夹。这很好用!如果将文件保留在卷中然后尝试重新启动容器,这会有些奇怪,因为它将覆盖大多数文件,但是诸如日志和安装程序未创建的文件之类的内容将保留,因此我们必须找出一些管理过程,但它的工作原理与我需要的一样,然后可以使用Windows共享从网络上的任何位置访问该卷文件夹。

这就是我的工作方式,实际上非常简单。

因此,在我的dockerfile中,我添加了一个批处理脚本,该脚本解压缩了复制到容器的安装DVD的压缩文件,并在解压缩后运行安装程序。然后,我使用CMD选项在容器启动时运行此命令:

  

Dockerfile

FROM microsoft/windowsservercore

ADD DVD.zip C:\\resources\\DVD.zip
ADD config.bat C:\\resources\\config.bat

CMD "C:\resources\config.bat" && cmd

然后我构建没有任何特殊要求的容器:

docker build -t my_container:latest .

并与该卷的附件一起运行它:

docker run -it -d -p 9999:9092 --mount source=my_volume,destination="C:/Program Files (x86)/{PROGRAM NAME}" my_container

就是这样。不幸的是,该容器需要花一点时间才能启动(尽管这样做值得,因为它没有在构建中运行安装程序,因此构建速度确实更快),并且该程序也没有安装/运行另外5分钟左右容器启动后,但是可以正常工作!

如果有人需要,我可以提供更多详细信息,但是其余大多数是特定于实现的,并且相当简单。

答案 1 :(得分:1)

与Docker composer一起尝试。不幸的是,我无法测试它,因为我正在使用Mac,它不是“受支持的平台”(Windows操作系统)。看看是否行得通,如果不尝试,请像这样volume

  

Dockerfile

- ./my_volume:C:/tmp/
  

Docker Composer

理想情况下应位于父文件夹中。

FROM microsoft/windowsservercore

# need to ecape \
WORKDIR C:\\tmp\\

# Add the program from host machine to container
ADD ["<source>", "C:\tmp"]

# Normally used with web servers
# EXPOSE 80

# Running the program
CMD ["C:\tmp\program.exe", "any-parameter"]
  

文件夹结构

version: "3"

services:
  windows:
    build: ./folder-of-Dockerfile
    volume:
      - type: bind
        source: ./my_volume
        target: C:/tmp/

    ports:
      - 9999:9092

只需运行|---docker-composer.yml | |---folder-of-Dockerfile | |---Dockerfile 即可构建并启动容器。将docker-composer up用于分离模式,只有在知道其正常工作后才能使用。

有用的链接Manage Windows Dockerfile