sma*_*ish 5 sftp sublimetext3 docker
目前我正在使用 Docker 容器内编辑文件vim
,但我希望有更好的方法。
根据我的研究,在本地计算机(例如 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,
}
Run Code Online (Sandbox Code Playgroud)
然而——不完全是这样——因为这种安排不起作用。
主要障碍似乎是不建议(不可能?)ssh
进入 docker 容器,至少不使用 macOS。
问题:
我们如何在本地计算机上使用 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
Run Code Online (Sandbox Code Playgroud)
如果合适的话,您也可以对整个文件夹执行此操作。格式是<hostfile>:<containerfile>
,我似乎记得它们需要是完全限定的路径(因此是pwd
)。
这里发生的情况是,包含构建版本的映像sftp-config.json
被动态反映指定主机副本状态的卷覆盖。
在某些情况下,可以像这样设置实时环境(例如 Traefik),以便在容器内使用主机上的配置文件。然而,值得记住的是,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
Run Code Online (Sandbox Code Playgroud)
我也在仅开发人员中对定义进行了同样的操作docker-compose.yml
,效果非常好。
如果您想在开发过程中快速更改容器,您可能不想通过 SSH 进入 - 主要是因为镜像通常不应该运行 SSH 守护进程。然而,你可以轻松地外壳:
docker exec -it <containername> sh
Run Code Online (Sandbox Code Playgroud)
哪里sh
是你的 shell 的名称。BusyBox 发行版倾向于使用sh
,而基于 Ubuntu 的容器可能会bash
提供。
从那里,您可以使用容器内编辑器进行更改。在容器的早期开发阶段,我倾向于保留RUN apk --update add nano
Dockerfile(当然,随着开发的稳定,它会被删除)。
为了总结评论中的一些说明,值得将 Docker 镜像视为:
我认为最后一点对于理解图像至关重要。当您执行此操作时docker build
,它会为每个命令添加一个层,这就是为什么可以从缓存中检索中间层和未更改的层而不是每次都重新构建的原因。
添加卷时,您可以将其视为顶部的另一层,但更改不是永久性的。考虑以下步骤:
/etc/mywidget.conf
图像 1234 包含一个包含“a=1”的文件conf/mywidget.conf
您可以将其COPY
添加到容器中Dockerfile
-v /path/to/conf/mywidget.conf:/etc/mywidget.conf
并重新启动容器,它将看到主机版本“a=2”;COPY
文件的新状态写入映像中,因此即使没有卷也会看到“a=2”。 归档时间: |
|
查看次数: |
7328 次 |
最近记录: |