docker - 使用 SFTP 从本地机器上的 Sublime Text 编辑 Docker 容器 ("remote"中的文件

标签 docker sublimetext3 sftp

目前我正在使用 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,
}

然而——不完全是那样——因为这种安排不起作用。

主要障碍似乎是在 ssh 不推荐(不可能?)进入 docker 容器,至少不使用 macOS。

This is a similar unanswered question from one year ago .

问题:

我们如何在本地机器上使用 Sublime Text 编辑 Docker 容器内的文件?如果 SFTP 是一个可行的选项,我们如何配置 sftp-config.json并启动一个可以使这成为可能的 Docker 容器?

最佳答案

简短的回答是你不能通过 FTP 进入没有运行 FTP 守护进程的服务器。但是,有几种替代方法可能适合您。



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

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

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

这里发生的是包含 sftp-config.json 的构建版本的图像。被动态反射(reflect)指定主机副本状态的卷覆盖。

在某些情况下,可以像这样设置实时环境( 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

我对仅限开发人员的定义做同样的事情 docker-compose.yml同样,它工作得非常好。

炮击

如果您想在开发过程中对容器进行快速更改,您可能不想通过 SSH 进入——主要是因为图像通常不应该运行 SSH 守护进程。但是,您可以轻松插入:
docker exec -it <containername> sh

哪里sh是您的 shell 的名称。 BusyBox 发行版倾向于 sh ,而基于 Ubuntu 的容器可能会有 bash可用的。

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

分层FS

为了总结评论中的一些澄清,值得将 Docker 镜像视为:
  • 不可变;
  • 版本化;
  • 由 CI/构建过程生成,只有通过自动化功能测试才能推广;
  • 由文件系统层组成

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

    添加卷时,您可以将其视为顶部的另一个层,但更改不是永久性的。考虑以下步骤:
  • 图像 1234 包含一个文件 /etc/mywidget.conf包含“a=1”
  • 这是从主机上的文件创建的,在您的项目中,名为 conf/mywidget.conf , 你 COPY到您的 Dockerfile 中的容器
  • 如果您修改主机中的文件,它不会更改容器中的副本,直到您重建
  • 因此,如果您将主机副本更改为“a=2”,然后重新启动容器,它仍然会看到旧副本;
  • 但是,如果您创建卷 -v /path/to/conf/mywidget.conf:/etc/mywidget.conf并重新启动您的容器,它将看到“a = 2”的主机版本;
  • 您可以将此卷视为容器构建版本之上的一个新层
  • 如果重新启动容器并删除卷,它将返回到“a=1”的构建版本
  • 最后,如果您重建镜像然后重新启动它,它将COPY文件的新状态进入图像,因此即使没有音量它也会看到“a = 2”。
  • 关于docker - 使用 SFTP 从本地机器上的 Sublime Text 编辑 Docker 容器 ("remote"中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46083648/

    相关文章:

    python - 可以在 Sublime Text 3 构建系统中在 python 2 和 3 之间切换吗? ( window )

    intellij-idea - 使用 Sublime 在 IntelliJ 中打开当前文件

    powershell - 在 PowerShell 中使用 WinSCP 从 SFTP 服务器下载特定文件名模式的最新文件

    windows - 将 SSL 证书添加到 Windows Docker 容器

    Django Web 应用程序 Docker - 无法连接

    使用 docker-compose 运行但不在 kubernetes 部署中的 Angular 应用程序镜像

    ssh - 有没有办法从我的本地开发环境访问远程服务器上正在运行的docker容器(Sublime)

    angular - 可以在 dockerfile 中获取 git 分支名称吗?

    ssh - 为什么 SFTP 客户端只需要知道私钥,不需要公钥?

    java - 使用 JSch 库在 Java 中获取 session 和 SFTP channel