因此,我正在尝试找到一种使用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 ++中查看文件的方法。
这里是否有明显的我想念的东西?这有多难?任何帮助表示赞赏。
答案 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
用于分离模式,只有在知道其正常工作后才能使用。