九年前,也就是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
文件、 Dockerfile
和 docker-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的官方文档。你可以在这里阅读更多细节。
P.S. 我是用GitHub Copilot写的这篇博文。 😉(这些都是我自己的文字、想法和挫折,但当我找不到合适的短语或动机时,Copilot帮助我解除了障碍。)via Rizèl Scarlett
原文地址:https://www.wbolt.com/developing-inside-containers.html