国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一招解決開發(fā)環(huán)境問題——遠程容器開發(fā)指南

這篇具有很好參考價值的文章主要介紹了一招解決開發(fā)環(huán)境問題——遠程容器開發(fā)指南。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

使用C++作為主要開發(fā)語言的程序猿們應(yīng)該會認同搭建開發(fā)環(huán)境是一件煩人的事情。為了編譯一個程序不僅需要下載各種依賴包,還可能面臨本地系統(tǒng)不兼容、編譯器版本不一致、包版本沖突等各種問題。筆者在運營iLogtail開源社區(qū)的過程中發(fā)現(xiàn)開發(fā)和調(diào)試環(huán)境問題也是成員問的最多的問題之一,那么有沒有一種方法可以徹底解決這一問題呢?

有。容器技術(shù)使應(yīng)用在各種環(huán)境可以一鍵部署,一致執(zhí)行,同樣的原理也適用于開發(fā)環(huán)境部署。利用 VSCode 的 Remote-Development 插件就可以使整個開發(fā)環(huán)境運行在遠程容器中。使用這種方式不但可以直接使用一致的環(huán)境開發(fā)編譯,而且還自然實現(xiàn)了多個開發(fā)環(huán)境的隔離。下面讓就我們由淺到深搭建這樣的遠端容器開發(fā)環(huán)境。

原理簡介

為什么要遠程+容器?遠程解決的是開發(fā)機資源問題和代碼安全問題,本地電腦的CPU和內(nèi)存比較有限,為了提高編譯、測試效率一般都會準備一臺專門用于開發(fā)測試的機器,而部分公司為了防止代碼外泄,只允許內(nèi)部開發(fā)機訪問代碼庫。容器解決的是開發(fā)環(huán)境一致性問題。兩者結(jié)合起來便能構(gòu)建最理想的開發(fā)環(huán)境。

在使用 Remote-Development 插件時,插件會ssh連接到遠程開發(fā)機,然后根據(jù)配置直接啟動或是鑄造開發(fā)環(huán)境鏡像后啟動開發(fā)環(huán)境容器。啟動時將開發(fā)機的Workspace目錄作為源掛載到容器中。開發(fā)環(huán)境容器啟動后,插件會自動安裝VS Code Server,并安裝配置指定的VS Code插件。一旦容器內(nèi)的VS Code Server啟動后,本地的VS Code就會直接與容器內(nèi)的VS Code Server建立通信。容器內(nèi)可以訪問Workspace所有文件,并且修改不會因容器退出而丟失。容器開發(fā)環(huán)境可以使用的VS Code插件,在Workspace的devcontainer.json配置中指定,下文會有詳細描述。

為了提高啟動速度并保留容器內(nèi)插件的配置,開發(fā)容器內(nèi)的/vscode目錄其實掛載了一個docker volume,不會自動隨docker退出而回收,因此從第二次連接容器開發(fā)環(huán)境開始,無需重新安裝VS Code Server、插件等,啟動速度大大提高。

阿里云 遠程開發(fā),云計算,阿里云,c++

環(huán)境準備

要使VS Code可以遠程連接開發(fā)機,最好使用ssh密鑰建立本地電腦和開發(fā)機的信任關(guān)系。要使用容器進行開發(fā),開發(fā)機上必須安裝Docker。這兩步相關(guān)教程網(wǎng)上較多,在這里就不再贅述。

需要注意的是,要使VS Code通過ssh連上開發(fā)機并通過docker啟動開發(fā)環(huán)境容器,建立信任關(guān)系的賬戶必須具備docker使用權(quán)限。如果使用root賬戶,那么自然具備。如果非root則可以使用任意一種方式使賬戶獲得docker使用權(quán)限:

  1. 將用戶加入docker組。參考Post-installation steps for Linux(https://docs.docker.com/engine/install/linux-postinstall)。
    sudo usermod -aG docker $USER
  2. 將docker.sock權(quán)限修改為777(不太推薦,除非上述方法無法奏效)。
    sudo chmod 777 /var/run/docker.sock

下面假設(shè)開發(fā)機使用的是Linux系統(tǒng),并且與本地電腦已經(jīng)建立好信任關(guān)系,而且安裝并具備Docker訪問權(quán)限。

安裝插件

在VS Code的Marketplace中搜索“Remote Development”安裝插件。

阿里云 遠程開發(fā),云計算,阿里云,c++

安裝完成后,會發(fā)現(xiàn)多出了3個子插件。

  • Remote - Containers:連接容器開發(fā)
  • Remote - SSH:連接ssh遠程開發(fā)
  • Remote - WSL:連接WSL(Windows Linux子系統(tǒng))開發(fā)

使用鏡像開發(fā)

使用 Remote Development 插件最直接的方式就是利用現(xiàn)成的編譯鏡像啟動開發(fā)容器。這里以使用C++和Go語言編寫、依賴環(huán)境相對復(fù)雜的開源項目iLogtail數(shù)據(jù)采集器項目為例,說明如何利用 Remote Development 插件進行遠程容器開發(fā)。

1. 創(chuàng)建Remote Development配置

在iLogtail Workspace的頂層目錄創(chuàng)建.devcontainer目錄,并在里面創(chuàng)建devcontainer.json文件。

阿里云 遠程開發(fā),云計算,阿里云,c++

配置文件的內(nèi)容如下:

{
  "image": "sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/ilogtail-community-edition/ilogtail-build-linux:latest",
  "customizations": {
    "vscode": {
      "extensions": [
        "golang.Go",
        "ms-vscode.cpptools-extension-pack"
      ]
    }
  }
}

其中,image字段是Remote Development插件啟動開發(fā)環(huán)境的鏡像地址,customizations.vscode.extensions指定了開發(fā)環(huán)境的插件。部分插件介紹如下,開發(fā)者也可以按照自己的習(xí)慣進行修改。

插件名 用途
golang.Go Go開發(fā)必備插件
ms-vscode.cpptools-extension-pack C++開發(fā)必備插件

2. 在容器中打開代碼庫

使用Shift + Command + P(Mac)或Ctrl + Shift + P(Win)打開命令面板,輸入reopen,選擇Remote-Containers: Reopen in Container

阿里云 遠程開發(fā),云計算,阿里云,c++

或者若出現(xiàn)如下圖提示,則可以直接點擊在容器中重新打開。

阿里云 遠程開發(fā),云計算,阿里云,c++

首次打開時會比較慢,因為要下載鏡像并安裝插件,后面再次打開時速度會很快。按照提示進行鏡像Build。

完成上述步驟后,我們已經(jīng)可以使用VS Code進行代碼編輯,并在其中進行代碼編譯。

注:如果以前拉取過編譯鏡像,可能需要觸發(fā)Remote-Containers: Rebuild Container重新構(gòu)建。

3. 在容器中進行開發(fā)

開發(fā)容器啟動后,我們已經(jīng)可以在VS Code中瀏覽Workspace代碼了。但是隨便打開一個文件,滿眼都是錯誤提示,代碼的跳轉(zhuǎn)功能也不能正常工作。這是因為C++開發(fā)環(huán)境的includePath沒有被正確配置。

阿里云 遠程開發(fā),云計算,阿里云,c++

打開命令面板,輸入C++ config,選擇C/C++: Edit Configurations(UI)。

阿里云 遠程開發(fā),云計算,阿里云,c++

找到Include path,輸入鏡像內(nèi)依賴庫的路徑。

阿里云 遠程開發(fā),云計算,阿里云,c++

再回來看代碼時,錯誤提示都消失了,并且函數(shù)定義跳轉(zhuǎn)正常。

4. 在容器中進行編譯

打開新Terminal(找不到的可以在命令面板中輸入Terminal,選擇新開一個)

阿里云 遠程開發(fā),云計算,阿里云,c++

  • 編譯iLogtail Go插件

make vendor # 若需要更新插件依賴庫 make plugin_local # 每次更新插件代碼后從這里開始

阿里云 遠程開發(fā),云計算,阿里云,c++

  • 編譯iLogtail C++代碼

mkdir -p core/build # 若之前沒有建過 cd core/build cmake .. # 若增刪文件,修改CMakeLists.txt后需要重新執(zhí)行 make -sj$(nproc) # 每次更新core代碼后從這里開始

阿里云 遠程開發(fā),云計算,阿里云,c++

阿里云 遠程開發(fā),云計算,阿里云,c++

5. 獲取編譯產(chǎn)出

由于VS Code是直接將代碼庫目錄掛載到鏡像內(nèi)的,因此主機上可以直接訪問鏡像內(nèi)的編譯產(chǎn)出。

阿里云 遠程開發(fā),云計算,阿里云,c++

到這里,如果要求不高的話就可以結(jié)束了,但細心的讀者一定發(fā)現(xiàn)了一個問題,容器內(nèi)生成的文件在主機上都是root權(quán)限,必須執(zhí)行sudo chown -R $USER .進行修復(fù)。如果社區(qū)的成員開發(fā)機沒有sudo權(quán)限怎么辦?作為iLogtail社區(qū)核心貢獻者,當(dāng)然不能把這樣的坑留給隊友了。

使用Dockerfile開發(fā)

那有沒有辦法做到容器內(nèi)權(quán)限自動適配主機呢?這樣的問題當(dāng)然不會難倒VS Code了。Remote Development 插件支持使用 Dockerfile 在容器中進行開發(fā),即在啟動開發(fā)容器前先使用docker build一個開發(fā)鏡像,這給了修正容器內(nèi)賬戶權(quán)限的機會。

修正的原理如下:

  1. 在Remote Development 插件 docker build 前將開發(fā)機的賬戶名、賬戶ID、組名和組ID暴露給 docker。
  2. docker build時利用這些賬戶信息修正容器執(zhí)行賬戶和容器內(nèi)文件權(quán)限。

接下來我們進行實際操作。

1. 修改.devcontainer.json配置文件

在配置文件中,將image部分修改為build部分,使用Dockerfile啟動開發(fā)容器。同時,加入initializeCommand,在build鏡像前,將賬戶信息暴露給docker。

{
  "build": {
    "dockerfile": "Dockerfile",
    "args": {
      "USERNAME": "${localEnv:USER}"
    }
  },
  "initializeCommand": ".devcontainer/gen_env.sh",
  "onCreateCommand": "sudo chown -R $(id -un):$(id -gn) /root",
  "customizations": {
    "vscode": {
      "extensions": [
        "golang.Go",
        "ms-vscode.cpptools-extension-pack"
      ]
    }
  }
}

2. 創(chuàng)建Dockerfile

以編譯鏡像作為基礎(chǔ)鏡像,編寫Dockerfile對鏡像內(nèi)賬戶和文件權(quán)限進行修正。

FROM sls-opensource-registry.cn-shanghai.cr.aliyuncs.com/ilogtail-community-edition/ilogtail-build-linux:latest
ARG USERNAME=admin
USER root
# Create the user
COPY .env /tmp/.env
RUN source /tmp/.env && rm /tmp/.env; \
    if getent passwd $USERNAME; then userdel -f $USERNAME; fi; \
    if [ $HOST_OS = "Linux" ]; then \
    if getent group $GROUPNAME; then groupdel $GROUPNAME; fi; \
    groupadd --gid $GROUP_GID $GROUPNAME; \
    fi; \
    useradd --uid $USER_UID --gid $GROUP_GID -m $USERNAME; \
    echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME; \
    chmod 0440 /etc/sudoers.d/$USERNAME; \
    chown -R $USERNAME:$GROUPNAME /opt/logtail $(eval echo ~$USERNAME); \
    chmod 755 $(eval echo ~$USERNAME);
USER $USERNAME

COPY .env /tmp/.env將主機的賬戶信息通過文件形式復(fù)制到容器中。

接下來的幾行根據(jù)這些信息在容器內(nèi)創(chuàng)建對應(yīng)的賬戶。

echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME;授予該用戶sudo權(quán)限。

chmodchown的幾行對文件權(quán)限進行修正,使新建的用戶有權(quán)限讀寫對應(yīng)目錄。其中對HOME(~$USERNAME)目錄的修正必須在這里進行,否則會導(dǎo)致VS Code Sever沒有權(quán)限安裝,導(dǎo)致插件啟動失敗。

3. 創(chuàng)建腳本暴露主機賬戶信息

gen_env.sh腳本內(nèi)容如下。該腳本對開發(fā)機為Mac系統(tǒng)也做了兼容。

bset -ue
set -o pipefail
if uname -s | grep Linux; then
  echo -e "HOST_OS=Linux\nUSERNAME=$USER\nUSER_UID=$(id -u $USER)\nGROUPNAME=$(id -gn $USER)\nGROUP_GID=$(id -g $USER)" > .devcontainer/.env;
else
  echo "HOST_OS=Darwin\nUSERNAME=$USER\nUSER_UID=$(id -u $USER)\nGROUPNAME=root\nGROUP_GID=0" > .devcontainer/.env;  
fi

前3步完成后,Workspace中的配置目錄應(yīng)該有這樣3個文件:

阿里云 遠程開發(fā),云計算,阿里云,c++

4. 運行觀察效果

使用Shift + Command + P(Mac)或Ctrl + Shift + P(Win)打開命令面板,輸入reopen,選擇Remote-Containers: Rebuild Container。

阿里云 遠程開發(fā),云計算,阿里云,c++

在容器內(nèi)重新執(zhí)行id命令查看賬戶信息,可以看到與開發(fā)機一致。

阿里云 遠程開發(fā),云計算,阿里云,c++

在容器內(nèi)重新執(zhí)行之前的編譯命令。然后會到開發(fā)機上查看生成的文件權(quán)限,可以看到容器內(nèi)生成的文件,在開發(fā)機上都已經(jīng)變成正確的權(quán)限了。

阿里云 遠程開發(fā),云計算,阿里云,c++

在容器內(nèi)調(diào)試

除了編譯代碼,開發(fā)環(huán)境另一個重要功能是進行本地調(diào)試。打開一個iLogtail插件的單元測試文件,設(shè)置斷電然后點擊“debug test”。

阿里云 遠程開發(fā),云計算,阿里云,c++

什么?Failed to launch: could not launch process: fork/fork/exec ...: operation not permitted,出錯了!

阿里云 遠程開發(fā),云計算,阿里云,c++

查閱資料,原來是docker默認的安全策略使用Secure computing mode (seccomp)僅允許白名單系統(tǒng)調(diào)用,debug所需的系統(tǒng)調(diào)用被拒絕了。我們嘗試在配置文件中添加一行"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],禁用該功能。

{
  "build": {
    "dockerfile": "Dockerfile",
    "args": {
      "USERNAME": "${localEnv:USER}"
    }
  },
  "initializeCommand": ".devcontainer/gen_env.sh",
  "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
  "customizations": {
    "vscode": {
      "extensions": [
        "golang.Go",
        "ms-vscode.cpptools-extension-pack",
        "DavidAnson.vscode-markdownlint"
      ]
    }
  }
}

Rebuild Container后,再次嘗試調(diào)試功能。It works!

阿里云 遠程開發(fā),云計算,阿里云,c++

總結(jié)

至此,我們已經(jīng)可以happy地通過VS Code的Remote Development插件在遠程容器內(nèi)開發(fā)了。并且使用的編譯鏡像和插件配置文件都是可移植,可重復(fù)的,CI到代碼庫后可以供任何開發(fā)者使用。文章中提到的代碼都可以到iLogtaill的GitHub倉庫(https://github.com/alibaba/ilogtail)獲取。

Remote Development插件還有很多的功能沒有在本篇文章中使用到,感興趣的讀者可以根據(jù)文末參考資料進一步研究探索。

參考資料

  1. Developing inside a Container using Visual Studio Code Remote Development:?https://code.visualstudio.com/docs/remote/containers
  2. Create a development container using Visual Studio Code Remote Development:?https://code.visualstudio.com/docs/remote/create-dev-container
  3. Running Docker Containers as Current Host User - Juan Treminio - Senior Web Developer Blog:?https://jtreminio.com/blog/running-docker-containers-as-current-host-user/
  4. Add non-root user to a container:?https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user
  5. devcontainer.json reference:?https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user
  6. Seccomp security profiles for Docker:?https://docs.docker.com/engine/security/seccomp/
  7. alibaba/ilogtail: Fast and Lightweight Observability Data Collector:?https://github.com/alibaba/ilogtail

原文鏈接

本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。文章來源地址http://www.zghlxwxcb.cn/news/detail-792171.html

到了這里,關(guān)于一招解決開發(fā)環(huán)境問題——遠程容器開發(fā)指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Boost程序庫完全開發(fā)指南:1-開發(fā)環(huán)境和構(gòu)建工具

    Boost程序庫完全開發(fā)指南:1-開發(fā)環(huán)境和構(gòu)建工具

    ??Boost官方于2019年12月發(fā)布的1.72版編寫,共包含160余個庫/組件,涵蓋字符串與文本處理、容器、迭代器、算法、圖像處理、模板元編程、并發(fā)編程等多個領(lǐng)域,使用Boost,將大大增強C++的功能和表現(xiàn)力。環(huán)境:Windows 10,WSL2,Ubuntu 20.04 LTS,Rider(WSL遠程開發(fā)),gcc/g++ 9.4.0,

    2024年02月07日
    瀏覽(21)
  • Kotlin 開發(fā)環(huán)境配置指南

    Kotlin 開發(fā)環(huán)境配置指南

    步驟 1:獲取最新版 Kotlin 編譯器 要配置 Kotlin 開發(fā)環(huán)境,首先需要從 JetBrains 官方 GitHub 倉庫下載最新的 Kotlin 編譯器。訪問以下鏈接以獲取最新版本的編譯器: 在該頁面中,找到適合您操作系統(tǒng)的 Kotlin 編譯器發(fā)行版(例如 kotlin-compiler-xxxx.zip ),其中 xxxx 表示當(dāng)前的版本號

    2024年01月25日
    瀏覽(22)
  • 鴻蒙系統(tǒng)開發(fā)編譯指南(官網(wǎng)開發(fā)文檔+docker環(huán)境方式)

    鴻蒙系統(tǒng)開發(fā)編譯指南(官網(wǎng)開發(fā)文檔+docker環(huán)境方式)

    注意1: OpenHarmony系統(tǒng)的開發(fā)環(huán)境搭建、編譯、燒錄、調(diào)測,最好直接參考官網(wǎng)開發(fā)文檔,因為更新頻繁,大多數(shù)人的流程都不一樣。 https://www.harmonyos.com/ ? ? ? ????????因為一般都需要使用命令行操作,而且通過命令行操作才能深入了解原理,后續(xù)也可以在其基礎(chǔ)上增

    2024年02月05日
    瀏覽(23)
  • 鴻蒙系統(tǒng)開發(fā)之編譯指南(官網(wǎng)開發(fā)文檔+docker環(huán)境方式)

    鴻蒙系統(tǒng)開發(fā)之編譯指南(官網(wǎng)開發(fā)文檔+docker環(huán)境方式)

    注意1: OpenHarmony系統(tǒng)的開發(fā)環(huán)境搭建、編譯、燒錄、調(diào)測,最好直接參考官網(wǎng)開發(fā)文檔,因為更新頻繁,大多數(shù)人的流程都不一樣。 https://www.harmonyos.com/ ? ? ? ????????因為一般都需要使用命令行操作,而且通過命令行操作才能深入了解原理,后續(xù)也可以在其基礎(chǔ)上增

    2024年02月04日
    瀏覽(27)
  • python 開發(fā)環(huán)境(PyCharm)搭建指南

    python 開發(fā)環(huán)境(PyCharm)搭建指南

    參考:Python基礎(chǔ)教程——搭建Python編程環(huán)境 下載 Python Python 下載地址:官網(wǎng) (1)點擊【Downloads】點擊【W(wǎng)indows】點擊【Python 3.x.x】下載最新版 Python; Python官網(wǎng)下載頁面: (2) 勾選【Add python.exe to PYTH 】 點擊【Customize installation】,自定義安裝位置 點擊【OK】,完成安裝。

    2024年02月11日
    瀏覽(56)
  • Docker Golang 開發(fā)環(huán)境搭建指南

    在 Golang 開發(fā)中,搭建合適的開發(fā)環(huán)境是非常重要的。然而,由于 Golang 的跨平臺特性,不同操作系統(tǒng)之間的配置差異可能會導(dǎo)致環(huán)境搭建過程變得復(fù)雜。為了簡化這個過程并保持開發(fā)環(huán)境的一致性,我們可以使用 Docker 來創(chuàng)建一個統(tǒng)一的 Golang 開發(fā)環(huán)境。 本文將介紹如何使用

    2024年02月03日
    瀏覽(24)
  • Android開發(fā)配置OpenCV環(huán)境詳細指南

    Android開發(fā)配置OpenCV環(huán)境詳細指南 在進行Android開發(fā)時,我們經(jīng)常需要使用圖像處理庫來實現(xiàn)各種功能。其中,OpenCV是一個強大且廣泛應(yīng)用的開源計算機視覺庫。本文將詳細介紹如何在Android開發(fā)環(huán)境中配置OpenCV,并附帶相應(yīng)的源代碼和說明。 步驟一:下載OpenCV庫文件 首先,我

    2024年02月08日
    瀏覽(28)
  • ubuntu can應(yīng)用開發(fā)環(huán)境搭建指南

    can數(shù)據(jù)發(fā)送這個采用來自網(wǎng)上的一段代碼進行測試: can_send.c代碼內(nèi)容如下:

    2024年02月11日
    瀏覽(29)
  • 【Rust指南】快速入門|開發(fā)環(huán)境|hello world

    【Rust指南】快速入門|開發(fā)環(huán)境|hello world

    ??本篇博客是Rust語言系列的開篇之作,以后有關(guān)Rust語言的文章也都會收錄在我的 《進軍Rust》 專欄里,我會精心打造這個專欄,幫助大家快速入門Rust語言,享受Rust語言帶來的編程樂趣。雖然Rust相比其他語言入門慢,但這恰巧說明了Rust語言的特色——安全高效。對Rust語言

    2024年02月15日
    瀏覽(19)
  • 獲取Windows11開發(fā)環(huán)境及VirtualBox配置指南

    獲取Windows11開發(fā)環(huán)境及VirtualBox配置指南

    今天我們來講一講Windows11開發(fā)環(huán)境的快速搭建,主要是通過Virtualbox虛擬機安裝微軟官方預(yù)先配置好的Windows11環(huán)境包,配置簡單,開箱即用。 微軟官方提供了多個系統(tǒng)平臺的Windows11虛擬機鏡打包鏡像,只需要導(dǎo)入后開箱使用。 官方下載地址: VMWare | Hyper-V (Gen2) | VirtualBox | Pa

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包