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

时间:2017-09-06 20:14:52

标签: docker sublimetext3 sftp

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

根据我的研究,在一台本地机器的文本编辑器上编辑Docker容器内的文件似乎是最好的方法,例如Sublime Text,就是使用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,
}

然而 - 并非完全相同 - 因为这种安排不起作用。

主要障碍似乎是{{1>}不建议(不可能?)进入docker容器,至少不使用macOS。

This is a similar unanswered question from one year ago

问题:

我们如何使用本地计算机上的Sublime Text编辑Docker容器内的文件?如果SFTP是一个可行的选项,我们如何配置ssh并启动可以实现这一目标的Docker容器?

1 个答案:

答案 0 :(得分:1)

简短的回答是,您无法通过FTP进入未运行FTP守护程序的服务器。但是,有一些替代方案可能适合您。

您可以使用自定义docker run进行开发,以便将配置公开给主机。你可以这样做:

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

如果合适,您也可以使用整个文件夹。格式为<hostfile>:<containerfile>,我似乎记得它们需要是完全限定的路径(因此pwd)。

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

在某些情况下,可以像这样设置实时环境(Traefik, for example),以便在容器内使用主机上的配置文件。但是,值得记住的是,Docker的目的是创建已经通过CI过程的独立映像。因此,出于方便原因,您移动到主机的依赖性越多,它们变得越脆弱且未经测试。

出于兴趣,我在开发时使用卷,因此我不需要为每个小的更改进行重建/重启循环。我为我的应用程序中的每个关键文件夹创建了一个卷,这极大地加快了修改和尝试循环。当然,这不会取代正确的构建/ 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发行版测试用于sh,而基于Ubuntu的容器可能有bash可用。

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

分层FS

要在评论中总结一些说明,有必要将Docker图像视为:

  • 不可变的;
  • 版本化;
  • 由CI /构建过程生成,只有在通过自动功能测试时才会被提升;
  • 由归档系统层组成

我认为最后一点对理解图像至关重要。执行docker build时,它会为每个命令添加一个图层,这就是为什么可以从缓存中检索中间和未更改的图层,而不是每次都重建。

添加卷时,您可以将其视为顶层的另一层,但更改不是永久性的。请考虑以下步骤:

  • 图片1234包含一个文件/etc/mywidget.conf,其中包含&#34; a = 1&#34;
  • 这是根据您项目中主机上名为conf/mywidget.conf的文件创建的,您COPY
  • 中的容器Dockerfile
  • 如果您修改了主机中的文件,则在重建之前它不会更改容器中的副本
  • 因此,如果您将主机副本更改为&#34; a = 2&#34;,然后重新启动容器,它仍会看到旧副本;
  • 但是,如果您创建卷-v /path/to/conf/mywidget.conf:/etc/mywidget.conf并重新启动容器,则会看到&#34; a = 2&#34;;
  • 的主机版本
  • 您可以将此卷视为容器内置版本
  • 上的新图层
  • 如果您重新启动容器并删除卷,它将返回到&#34; a = 1&#34;
  • 的构建版本
  • 最后,如果您重建图像然后重新启动它,它会COPY文件的新状态进入图像,因此它会看到&#34; a = 2&#34;即使没有音量。