为什么人们在容器内开发?

为什么人们在容器内开发?

九年前,也就是2013年3月,所罗门-海克斯和他的联合创始人用一个名为Docker的开源平台彻底改变了我们做软件开发的方式。虽然Docker的创造者没有发明容器,但他们普及了它们。多亏了Docker,工程师们可以创建工具,比如GitHub Codespaces,使我们能够在云端托管的开发容器中进行编码。

我承认,当我第一次听到开发容器的时候,我有两个问题:

  • 为什么人们要在容器内开发?
  • 容器是什么?

如果你有类似的问题,这篇文章就是为你准备的。

在这篇博文中,我将解释什么是容器,它们如何使工程师受益,以及如何在GitHub代码空间中设置devcontainers。

在容器内开发是什么意思?

如果你曾经说过 “它在我的机器上可以工作” 的话,请举手。(别担心,你不是一个人)!

在容器内开发是什么意思?

如果你不熟悉这句话,它是一个备忘录,但它也是一个真实的短语,如果开发人员发现他们在一个环境不同的代码库中工作,他们会说这句话。虽然在不同的环境中工作并不理想,但它确实发生了。根据我的经验,当我的本地环境、我同事的本地环境、暂存环境和生产环境都有轻微差异时,就会出现这样的情况。因为环境的配置略有不同,所以错误在一个环境中存在,但在另一个环境中却不存在。构建一个功能或修复一个bug,在本地可以使用,但在生产或暂存环境中却不能使用,这可能会让人感到非常尴尬和沮丧。

然而,容器解决了开发者环境不一致的问题。容器使软件工程师能够在一个一致的环境中编程。现在,你的编码环境可以通过使用相同的操作系统、配置和依赖来反映生产。这确保了错误和功能在所有环境中的表现都是一样的,从而使开发人员摆脱了说 “它在我的机器上能工作” 的尴尬局面。

现在我们了解了容器的目的,让我们来探讨一下Codespaces如何利用容器。

GitHub Codespaces将软件和云开发提升到新的水平

GitHub Codespaces允许你在托管在云端的容器中进行编码。在这种情况下,云是一个不在你的电脑上而是在互联网上的环境。

更快的入职培训

通常情况下,软件工程师在加入一个团队时要负责设置他们的本地环境。本地环境的设置包括安装所需的依赖项、林特、环境变量等。开发人员可能会花上一周的时间来配置他们的环境,这取决于文档的质量。当我还是纯粹的软件工程师时,我花了大约2天时间来设置我的环境,这个经历是痛苦的,因为我想立即开始编码。相反,我不得不为我的数据库播种并编辑我的 .zshrc 文件。

幸运的是,企业可以使用GitHub Codespaces配置自定义环境,使入职过程自动化。当一个新工程师加入团队时,他们可以打开一个代码空间,跳过本地环境设置,因为所需的扩展、依赖和环境变量都存在于codespace中。

从任何地方进行编码

有了代码空间,我可以在任何可以上网的地方编码。如果我换了设备或把笔记本电脑忘在家里,我可以在飞机上轻松地在iPad上继续工作,而不需要克隆一个资源库,下载我喜欢的IDE,并设置一个本地环境。这是可能的,因为Codespaces在浏览器内打开一个类似Visual Studio代码的编辑器。最棒的是 Codespaces 可以自动保存我的代码,即使我忘记把我的修改推送到我的仓库。

一致的环境

正如上面几段提到的,容器允许你在一个镜像的生产环境中工作。因为GitHub Codespaces使用了容器,你可以在本地环境中获得与生产环境相同的结果和开发者体验。

此外,有时当代码库发生变化时,例如基础设施的增强,本地环境可能会中断。当本地环境断裂时,要由开发者来恢复他们的开发环境。然而,GitHub Codespaces对容器的使用给开发者环境带来了统一性,减少了在破损环境中工作的机会。

你可能需要三个文件来配置一个Codespace

你可以利用三个文件来使Codespaces体验对你和你的队友有用: devcontainer.json 文件、 Dockerfiledocker-compose.yml 文件。这些文件中的每一个都生活在你的仓库根部的 .devcontainer 目录下。

devcontainer.json文件

devcontainer.json 文件是一个配置文件,它告诉 GitHub Codespaces 如何配置一个代码空间。在devcontainer文件中,你可以配置以下内容:

  • 扩展程序
  • 环境变量
  • Dockerfile
  • 端口转发
  • 创建后的命令
  • 还有更多

这意味着当你或别人打开一个代码空间时,你在devcontainer.json文件中指定的扩展、环境变量和其他配置将在他们打开指定仓库的代码空间时自动安装。例如,如果我想让人们拥有和我一样的linter和扩展,我可以在我的devcontainer.json文件中加入以下内容: devcontainer.json

 {
"name": "Node.js",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick a Node version: 18, 16, 14.
// Append -bullseye or -buster to pin to an OS version.
// Use -bullseye variants on local arm64/Apple Silicon.
"args": { "VARIANT": "16-bullseye" }
},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"dbaeumer.vscode-eslint", // this is the exentension id for eslint
"esbenp.prettier-vscode", // this is the extension id for prettier
"ms-vsliveshare.vsliveshare", // this is the extension id for live share
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "yarn install",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node"
}

你可以在这里了解更多关于devcontainer.json文件。

Dockerfile

Dockerfile是一个配置文件,它告诉GitHub Codespaces如何构建一个容器。它包含一个Docker客户端在创建镜像时调用的命令列表。Dockerfile被用来自动安装和配置一个容器。例如,如果我想在容器中安装Node.js,我可以在我的Dockerfile中添加以下内容: Dockerfile

FROM node:16-bullseye

你可以在这里了解更多关于Dockerfiles的信息,你也可以在这里了解更多关于在Codespaces中设置node.js的信息。

docker-compose.yml文件

在Codespace中你不需要docker-compose.yml文件,但如果你想运行多个容器,它就很有用。例如,如果你想在一个Codespace中运行一个数据库和一个Web服务器,你可以使用docker-compose.yml文件来运行这两个容器。你可以在这里了解更多关于docker-compose.yml文件的信息。下面是一个连接数据库的docker-compose.yml文件可能看起来像的例子: docker-compose.yml

version: '3.8'
services:
app:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
args:
VARIANT: "3"
NODE_VERSION: "无"
volumes:
- ..:/workspace:cached
command: sleep infinity
network_mode: service:db
db:
image: postgres:latest
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
hostname: postgres
environment:
POSTGRES_DB: my_media
POSTGRES_USER: example
POSTGRES_PASSWORD: pass
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- 5432:5432
volumes:
postgres-data: null

Codespaces与GitHub的网络编辑器不一样

GitHub Codespaces 与 GitHub 的网页编辑器不同。网络编辑器是当你在仓库中按下”. “时出现的编辑器。它是一个轻量级的编辑器,允许你编辑仓库中的文件。网页编辑器很适合对文件进行细微的修改,但对于编写和运行全栈式网络应用程序来说,它并不理想。这是因为GitHub的网络编辑器没有终端。然而,Codespaces允许你在浏览器中运行一个配备终端等功能的成熟的IDE。

请看下面的图片,了解GitHub的网络编辑器和GitHub Codespaces的区别。这张图片来自GitHub的官方文档。你可以在这里阅读更多细节。

GitHub的网络编辑器和GitHub Codespaces的区别

P.S. 我是用GitHub Copilot写的这篇博文。 😉(这些都是我自己的文字、想法和挫折,但当我找不到合适的短语或动机时,Copilot帮助我解除了障碍。)via Rizèl Scarlett

评论留言