在我之前的实验笔记中,我证明了SQLite可以被集成到Rails开发容器中,而不需要太多麻烦。然而,其他常见的数据库引擎确实需要一些额外的努力来整合。在一个基于容器的开发环境中运行多个服务是很常见的--例如,数据库、后台作业处理器和正在开发的实际应用软件。
为了使这一切顺利进行,我需要打破Visual Studio Code的Remote-Container扩展所提供的一些默认设置。所以我将在这篇文章中做这件事。对配置进行相对快速的重构,以使用Docker Compose,这样它就可以在未来的实验中为其他服务做好准备。这个实验会比较短,但它将为今后的设置建立更复杂的附加功能。
让改变变得简单
现在,.devcontainer/devcontainer.json为我们的开发容器做了大量的工作。对于这个实验来说,有趣的部分是build 键。
{
"name": "my-app",
"build": {
"dockerfile": "Dockerfile",
"args": {
// Update 'VARIANT' to pick a Ruby version: 2, 2.7, 2.6, 2.5
"VARIANT": "2.5",
"NODE_VERSION": "lts/*"
}
},
// ...
}
对于更复杂的构建,VS Code支持集成Docker Compose。下面是我的第一遍看起来像什么。注意,它位于*.devcontainer*目录内,以表明它是针对开发环境的。
version: '3'
services:
my-app:
user: vscode
build:
context: ..
dockerfile: .devcontainer/Dockerfile
args:
# Update 'VARIANT' to pick a Ruby version: 2, 2.7, 2.6, 2.5
VARIANT: 2.6
NODE_VERSION: lts/*
volumes:
- ..:/workspace
# don't shut down after the process ends
command: sleep infinity
如果你过去曾使用过Docker,这可能看起来很熟悉:
- 该文件定义了一个名为my-app的服务(在此仅作说明,请给它起一个对你有意义的名字)。
- 容器内的操作将由vscode用户执行,以符合VS Code的默认设置。
- 构建环境位于*.devcontainer/docker-compose.yml*位置的上一级目录,或者Rails应用程序的根目录。
- 使用开发容器中已经存在的Docker文件。
- 应用之前在devcontainer.json中为Ruby和Node版本设置的args。
- 将 Rails 应用程序的本地路径 (
..) 映射到容器中的/workspace卷,因此在应用程序代码中进行的编辑将反映在容器中。 - 使用
command来保持容器在旋转后的运行。我的理解是,这对于Remote-Container能够通过VS Code终端shell进入容器是必要的。我的理解是模糊的,可能是错误的。
现在,我可以替换*.devcontainer/devcontainer.json*中的build ,以使用新的Docker Compose设置。
{
"name": "my-app",
"dockerComposeFile": "docker-compose.yml",
"service": "my-app",
"workspaceFolder": "/workspace",
// ...
}
下面是新的键的概要:
- dockerComposeFile是之前创建的文件,即*.devcontainer*里面的文件。
- service是指VS Code要插入的服务。这个值需要与Docker Compose文件中的Rails应用的服务名称相匹配。
- workspaceFolder告诉VS Code和Remote-Container在VS Code终端中安装Rails应用程序的位置。最终结果将与之前的情况略有不同*(/workspacevs./workspace/my-app*),但似乎工作正常。
有了这个变化,我就可以重建开发容器了,除了workspaceFolder在我的终端提示中有点不同之外,我又开始工作了
总结
和我一起工作的人知道我喜欢Kent Beck对重构的总结。"对于每一个想要的改变,让改变变得简单(警告:这可能很难),然后进行简单的改变"。
在这个实验中,使改变变得容易并不难,但我希望它仍然能使改变(开发容器中的额外功能)相对容易。
而从更长远的角度考虑,这种变化会不会在某个时候让突破Visual Studio Code变得更容易?时间会告诉我们。这就是把所有这一切当作实验的好处!