使用SFTP从本地计算机上的Sublime Text编辑Docker容器(“远程”)中的文件

目前我正在使用vim编辑Docker容器中的文件,但是我希望有更好的方法。

根据我的研究,似乎在本地机器的文本编辑器(例如Sublime Text)中编辑Docker容器内部文件的最好方法是使用Sublime SFTP 。

这需要编辑sftp-config.json文件,它看起来像这样:

 { // The tab key will cycle through the settings when first created // Visit http://wbond.net/sublime_packages/sftp/settings for help // sftp, ftp or ftps "type": "sftp", "sync_down_on_open": true, "sync_same_age": true, "host": "192.168.129.8", "user": "root", "password": "666", //"port": "22", "remote_path": "/", //"file_permissions": "664", //"dir_permissions": "775", //"extra_list_connections": 0, "connect_timeout": 30, //"keepalive": 120, //"ftp_passive_mode": true, //"ftp_obey_passive_host": false, //"ssh_key_file": "~/.ssh/id_rsa", //"sftp_flags": ["-F", "/path/to/ssh_config"], //"preserve_modification_times": false, //"remote_time_offset_in_hours": 0, //"remote_encoding": "utf-8", //"remote_locale": "C", //"allow_config_upload": false, } 

但是 – 不完全如此 – 因为这种安排不起作用。

主要的障碍似乎是不build议( 不可能?ssh到docker集装箱,至less不使用macOS。

这是一年前类似的未回答的问题 。

题:

我们如何在本地机器上使用Sublime Text来编辑Docker容器中的文件? 如果SFTP是一个可行的选项,我们如何configurationsftp-config.json并启动一个可以实现这个function的Docker容器?

简短的答案是你不能FTP进入一个没有运行FTP守护进程的服务器。 不过,有几个替代scheme可能适合你。

您可以使用自定义的docker run来进行开发,以便将您的configuration暴露给主机。 你可以做这样的事情:

 docker run \ -v `pwd`/sftp-config.json:/etc/sftp/sftp-config.json \ myimage 

你也可以用整个文件夹来做,如果这是适当的。 格式是<hostfile>:<containerfile> ,我似乎记得他们需要完全合格的path(因此pwd )。

这里发生的事情是,包含sftp-config.json的内置版本的映像被一个dynamic地反映指定主机副本状态的卷覆盖。

在某些情况下,可以像这样设置实时环境( 例如,Traefik ),以便在容器内使用主机上的configuration文件。 但值得一提的是,Docker的重点是创build通过CI进程的独立映像。 因此,出于方便的原因,移动到主机的依赖关系越多,它们变得越脆弱和未经testing。

出于兴趣,我在开发时使用了卷,所以我不需要为每一个小的改变都进行重build/重启周期。 我为我的应用程序中的每个关键文件夹创build了一个卷,这极大地加快了修改和尝试循环。 当然,这不会取代一个正确的构build/ CI过程,也不会在现场运行:

 #!/bin/bash # # Note the web service is on port 8080 PROJECT_ROOT=/var/www/missive_controller docker run \ --detach \ -p 10000:8080 \ -p 10002:8081 \ -v $(pwd)/bin:${PROJECT_ROOT}/bin \ -v $(pwd)/src:${PROJECT_ROOT}/src \ -v $(pwd)/vendor:${PROJECT_ROOT}/vendor \ -v $(pwd)/web:${PROJECT_ROOT}/web \ missive-controller 

我也在dev-only docker-compose.yml做了相同的定义,它的工作原理非常好。

轰轰烈烈

如果您想在开发过程中对容器进行快速更改,那么您可能不希望进行SSH操作 – 主要是因为图像通常不应该运行SSH守护进程。 但是,你可以很容易地装入:

 docker exec -it <containername> sh 

sh是你shell的名字。 BusyBox发行版testing用于sh ,而基于Ubuntu的容器可能有bash可用。

从那里,您可以使用容器内编辑器进行更改。 在一个容器的早期开发阶段,我倾向于离开RUN apk --update add nano在我的Dockerfile中RUN apk --update add nano (当然,随着开发的落实,它会被移除)。

分层的FS

为了在评论中总结一些说明,值得把Docker镜像看作是:

  • 不可改变的;
  • 版本;
  • 由CI /构build过程生成,只有通过自动化functiontesting才能升级;
  • 由文件系统层组成

我认为,最后一点对于理解图像至关重要。 当你做docker build它会为每个命令添加一个图层,这就是为什么中间层和未改变层可以从caching中检索,而不是每次重build。

当你添加一个音量时,你可以把它看作是另一层,除了这个改变不是永久的。 考虑这些步骤:

  • 图像1234包含一个包含“a = 1”的文件/etc/mywidget.conf
  • 这是从您的主机上的一个文件创build的,该文件名为conf/mywidget.conf ,您将其COPYDockerfile的容器
  • 如果您修改了主机中的文件,那么在重build之前,它不会更改容器中的副本
  • 因此,如果将主机副本更改为“a = 2”,然后重新启动容器,它仍会看到旧的副本;
  • 但是,如果你创build一个卷-v /path/to/conf/mywidget.conf:/etc/mywidget.conf并重启你的容器,它将会看到主机版本的“a = 2”。
  • 您可以将此卷视为在容器的内置版本上的新图层
  • 如果您重新启动容器并删除音量,它将回到构build版本的“a = 1”
  • 最后,如果重build图像然后重新启动,它会将文件的新状态COPY到图像中,所以即使没有音量也会看到“a = 2”。