使用 VS Code 在容器中開發(fā)
一致性可以避免當(dāng)你有多個(gè)開發(fā)人員開發(fā)同一個(gè)項(xiàng)目時(shí)出現(xiàn)問題。
當(dāng)你有多個(gè)不同開發(fā)環(huán)境的開發(fā)人員在一個(gè)項(xiàng)目上工作時(shí),編碼和測(cè)試的不一致性是一種風(fēng)險(xiǎn)。Visual Studio Code(VS Code)是一個(gè)集成開發(fā)環(huán)境(IDE),可以幫助減少這些問題。它可以和容器結(jié)合起來,為每個(gè)應(yīng)用程序提供獨(dú)立的開發(fā)環(huán)境,同時(shí)提供一個(gè)一致的開發(fā)環(huán)境。
VS Code 的 “Remote - Containers” 擴(kuò)展 使你能夠創(chuàng)建一個(gè)容器定義,使用該定義來構(gòu)建一個(gè)容器,并在容器內(nèi)進(jìn)行開發(fā)。這個(gè)容器定義可以和應(yīng)用程序代碼一起被簽入到源代碼庫(kù)中,這使得所有的開發(fā)人員可以使用相同的定義在容器中進(jìn)行構(gòu)建和開發(fā)。
默認(rèn)情況下,“Remote - Containers” 擴(kuò)展使用 Docker 來構(gòu)建和運(yùn)行容器,但使用 Podman 的容器運(yùn)行環(huán)境環(huán)境也很容易,它可以讓你使用 免 root 容器。
本文將帶領(lǐng)你完成設(shè)置,通過 Podman 在免 root 容器內(nèi)使用 VS Code 和 “Remote - Containers” 擴(kuò)展進(jìn)行開發(fā)。
初始配置
在繼續(xù)之前,請(qǐng)確保你的紅帽企業(yè) Linux(RHEL)或 Fedora 工作站已經(jīng)更新了最新的補(bǔ)丁,并且安裝了 VS Code 和 “Remote - Containers” 擴(kuò)展。(參見 VS Code 網(wǎng)站了解更多安裝信息)
接下來,用一個(gè)簡(jiǎn)單的 dnf install 命令來安裝 Podman 和它的支持包:
- $ sudo dnf install -y podman
安裝完 Podman 后,配置 VS Code 以使用 Podman 的可執(zhí)行文件(而不是 Docker)與容器進(jìn)行交互。在 VS Code 中,導(dǎo)航到 “文件 > 首選項(xiàng) > 設(shè)置”,點(diǎn)擊 “擴(kuò)展” 旁邊的 “>” 圖標(biāo)。在出現(xiàn)的下拉菜單中,選擇 “Remote - Containers”,并向下滾動(dòng)找到 “Remote - Containers: Docker Path” 選項(xiàng)。在文本框中,用 “podman” 替換 “docker”。
現(xiàn)在配置已經(jīng)完成,在 VS Code 中為該項(xiàng)目創(chuàng)建一個(gè)新的文件夾或打開現(xiàn)有的文件夾。
定義容器
本教程以創(chuàng)建 Python 3 開發(fā)的容器為例。
“Remote - Containers” 擴(kuò)展可以在項(xiàng)目文件夾中添加必要的基本配置文件。要添加這些文件,通過在鍵盤上輸入 Ctrl+Shift+P 打開命令面板,搜索 “Remote-Containers: Add Development Container Configuration Files”,并選擇它。
在接下來的彈出窗口中,定義你想設(shè)置的開發(fā)環(huán)境的類型。對(duì)于這個(gè)例子的配置,搜索 “Python 3” 定義并選擇它。
接下來,選擇將在容器中使用的 Python 的版本。選擇 “3 (default)” 選項(xiàng)以使用最新的版本。
Python 配置也可以安裝 Node.js,但在這個(gè)例子中,取消勾選 “Install Node.js”,然后點(diǎn)擊 “OK”。
它將創(chuàng)建一個(gè) .devcontainer 文件夾,包含文件devcontainer.json和Dockerfile。VS Code 會(huì)自動(dòng)打開devcontainer.json 文件,這樣你就可以對(duì)它進(jìn)行自定義。
啟用免 root 容器
除了明顯的安全優(yōu)勢(shì)外,以免 root 方式運(yùn)行容器的另一個(gè)原因是,在項(xiàng)目文件夾中創(chuàng)建的所有文件將由容器外的正確用戶 ID(UID)擁有。要將開發(fā)容器作為免 root 容器運(yùn)行,請(qǐng)修改 devcontainer.json 文件,在它的末尾添加以下幾行:
- "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z",
- "workspaceFolder": "/workspace",
- "runArgs": ["--userns=keep-id"],
- "containerUser": "vscode"
這些選項(xiàng)告訴 VS Code 用適當(dāng)?shù)?SELinux 上下文掛載工作區(qū),創(chuàng)建一個(gè)用戶命名空間,將你的 UID 和 GID 原樣映射到容器內(nèi),并在容器內(nèi)使用 vscode 作為你的用戶名。devcontainer.json 文件應(yīng)該是這樣的(別忘了行末的逗號(hào),如圖所示):
現(xiàn)在你已經(jīng)設(shè)置好了容器的配置,你可以構(gòu)建容器并打開里面的工作空間。重新打開命令調(diào)板(用 Ctrl+Shift+P),并搜索 “Remote-Containers: Rebuild and Reopen in Container”。點(diǎn)擊它,VS Code 將開始構(gòu)建容器?,F(xiàn)在是休息一下的好時(shí)機(jī)(拿上你最喜歡的飲料),因?yàn)闃?gòu)建容器可能需要幾分鐘時(shí)間:
一旦容器構(gòu)建完成,項(xiàng)目將在容器內(nèi)打開。在容器內(nèi)創(chuàng)建或編輯的文件將反映在容器外的文件系統(tǒng)中,并對(duì)這些文件應(yīng)用適當(dāng)?shù)挠脩魴?quán)限?,F(xiàn)在,你可以在容器內(nèi)進(jìn)行開發(fā)了。VS Code 甚至可以把你的 SSH 密鑰和 Git 配置帶入容器中,這樣提交代碼就會(huì)像在容器外編輯時(shí)那樣工作。
接下來的步驟
現(xiàn)在你已經(jīng)完成了基本的設(shè)置和配置,你可以進(jìn)一步加強(qiáng)配置的實(shí)用性。比如說:
- 修改 Dockerfile 以安裝額外的軟件(例如,所需的 Python 模塊)。
- 使用一個(gè)定制的容器鏡像。例如,如果你正在進(jìn)行 Ansible 開發(fā),你可以使用 Quay.io 的 Ansible Toolset。(確保通過 Dockerfile 將 vscode 用戶添加到容器鏡像中)
- 將 .devcontainer 目錄下的文件提交到源代碼庫(kù),以便其他開發(fā)者可以利用容器的定義進(jìn)行開發(fā)工作。
在容器內(nèi)開發(fā)有助于防止不同項(xiàng)目之間的沖突,因?yàn)楦綦x了不同項(xiàng)目的依賴關(guān)系及代碼。你可以使用 Podman 在免 root 環(huán)境下運(yùn)行容器,從而提高安全性。通過結(jié)合 VS Code、“Remote - Containers” 擴(kuò)展和 Podman,你可以輕松地為多個(gè)開發(fā)人員建立一個(gè)一致的環(huán)境,減少設(shè)置時(shí)間,并以安全的方式減少開發(fā)環(huán)境的差異帶來的錯(cuò)誤。