)
編程語言編譯器云原生語言運行時【免費下載鏈接】wingA programming language for the cloud ?? A unified programming model, combining infrastructure and runtime code into one language ?項目地址https://gitcode.com/gh_mirrors/wi/wing點擊查看免費下載導讀sim.Container是 Wing 標準庫中用于在本地模擬器Wing Simulator中運行 Docker 容器的資源它允許開發(fā)者在真實的云端部署之前用本地容器完成服務聯(lián)調(diào)與測試。本文以倉庫中的 Hangar 測試快照 entrypoint.test.w_test_sim.md 為線索完整拆解sim.Container自定義entrypoint與args的實戰(zhàn)寫法、全部構造參數(shù)、底層docker run命令的生成邏輯、hostPort端口映射原理以及容器的停止與強制清理機制讀完即可在自己的 Wing 項目中熟練編排帶自定義啟動命令的本地容器并理解其運行日志的每一行含義。一、快照文檔是什么Hangar 端到端測試的產(chǎn)物tools/hangar/__snapshots__/test_corpus/sdk_tests/container/目錄下的快照文件是 Wing 倉庫中 Hangar 工具鏈見 tools/hangar/README.md運行端到端測試后生成的確定性輸出。快照目錄的定位邏輯定義在 tools/hangar/src/paths.tssnapshotDir path.join(hangarDir, __snapshots__)而測試用例的收集路徑定義在 tools/hangar/src/generate_tests.ts。本文的主角entrypoint.test.w_test_sim.md就是測試源文件 tests/sdk_tests/container/entrypoint.test.w 在sim 目標Wing Simulator下執(zhí)行一次測試后的標準輸出快照其內(nèi)容如下[INFO] container with entrypoint | hello [WARNING] container with entrypoint | Timeout waiting for container root/Default/with-entrypoint to shutdown, removing forcefully pass ─ entrypoint.test.wsim ? root/Default/test:container with entrypoint Tests 1 passed (1) Snapshots 1 skipped Test Files 1 passed (1) Duration DURATION這份快照雖然只有十幾行卻完整記錄了一次帶自定義 entrypoint 的容器測試從啟動、請求到關閉的全過程是理解sim.Container行為最直接的事實依據(jù)。二、測試源碼剖析自定義 entrypoint 的最小完整示例快照對應的測試源碼 entrypoint.test.w 全文如下/*\ skipPlatforms: - win32 - darwin \*/ bring sim; bring http; bring expect; // only relevant in simulator if target sim { let entrypoint new sim.Container( name: my-entrypoint-app, image: ./my-docker-image, containerPort: 3000, args: [-c, RESPONSEhello /usr/local/bin/node /app/index.js], entrypoint: /bin/sh, ) as with-entrypoint; test container with entrypoint { let response http.get(http://localhost:{entrypoint.hostPort!}); log(response.body); expect.equal(hello, response.body); } }這段代碼有幾個值得注意的關鍵點skipPlatforms聲明該測試明確跳過 win32 與 darwin 平臺因為容器資源依賴 Docker 守護進程Linux 是 Wing 模擬器容器測試的標準環(huán)境。if target sim條件編譯sim.Container僅存在于模擬器目標因此整個資源創(chuàng)建與測試都包裹在目標判斷中避免在tf-aws等編譯目標下生效。這一點從同名編譯快照 entrypoint.test.w_compile_tf-aws.md 可以得到印證——tf-aws 目標下生成的主 Terraform 文件幾乎是空的沒有任何容器相關資源。自定義entrypoint與argsentrypoint: /bin/sh覆蓋了鏡像默認的入口程序args: [-c, RESPONSEhello /usr/local/bin/node /app/index.js]則把啟動參數(shù)傳給/bin/sh組合效果等價于在容器內(nèi)執(zhí)行RESPONSEhello /usr/local/bin/node /app/index.js——即以環(huán)境變量方式注入響應內(nèi)容并啟動 Node 服務。hostPort!非空斷言hostPort是 Wing 的 token 屬性只有在容器真正啟動、端口完成映射后才會解析出宿主機端口測試中通過!斷言其已就緒。鏡像本身來自本地目錄 tests/sdk_tests/container/my-docker-image其中的 Dockerfile 與 index.js 定義了測試服務的真實行為FROM node:20.8.0-alpine EXPOSE 3000 ADD index.js /app/index.js ENTRYPOINT [ /app/index.js ]const response process.env.RESPONSE; const server http.createServer((req, res) { res.end(response ?? Hello, Wingnuts!); }); console.log(listening on port 3000); server.listen(3000);注意index.js中process.env.RESPONSE的讀取邏輯默認鏡像入口直接運行/app/index.js時響應的是默認值Hello, Wingnuts!而entrypoint.test.w通過把entrypoint換成/bin/sh、用args注入RESPONSEhello環(huán)境變量讓同一鏡像在測試中返回hello??煺盏谝恍衃INFO] container with entrypoint | hello正是log(response.body)輸出的結(jié)果expect.equal(hello, response.body)隨之通過測試在末尾打印pass。三、sim.Container 完整 API全部構造參數(shù)與默認值sim.Container的構造參數(shù)ContainerProps定義于 packages/winglang/sdk/src/target-sim/container.ts官方 API 文檔見 docs/api/04-standard-library/sim/container.md。完整參數(shù)清單如下參數(shù)類型必填默認值說明namestr是無容器名稱也參與鏡像標簽的生成imagestr是無公共 Docker 鏡像名拉取運行或本地含Dockerfile的目錄路徑構建運行containerPortnum否不暴露端口容器內(nèi)部需要暴露的 TCP 端口設置后才會生成hostPortenvMutMapstr否{}注入容器的環(huán)境變量argsMutArraystr否[]傳給容器 entrypoint 的參數(shù)entrypointstr否鏡像默認 entrypoint覆蓋容器入口程序volumesMutArraystr否[]卷掛載點如[/host:/container]以/開頭且不含:的路徑按匿名卷處理networkstr否Docker 默認網(wǎng)絡Docker 網(wǎng)絡模式如host、bridgesourcePatternstr否構建上下文全部文件計算源碼哈希時參與的 glob 模式用于判斷是否需要重建鏡像sourceHashstr否基于源文件自動計算顯式指定代表容器源碼的哈希值其中entrypoint與args的語義需要區(qū)分entrypoint覆蓋的是 Docker 的--entrypoint入口程序本身而args是傳給該入口的啟動參數(shù)。在 Dockerfile 中鏡像默認入口是ENTRYPOINT [ /app/index.js ]測試將其替換為/bin/sh后args中的-c RESPONSEhello ...就變成了 shell 執(zhí)行的命令行。正是二者的組合實現(xiàn)了同一鏡像、不同啟動方式的靈活性。四、底層原理一條 docker run 命令是如何拼出來的sim.Container在模擬器中運行時的實際載體是 packages/winglang/sdk/src/target-sim/container.inflight.ts 中的Container類。該類的start()方法container.inflight.ts逐段拼接出最終的docker run命令固定參數(shù)-i --rm --name wing-ulid其中--rm保證容器退出即被清理容器名以wing-前綴加 ULID 生成以避免沖突網(wǎng)絡參數(shù)配置了network時追加--networknetworkcontainer.inflight.ts端口映射設置了containerPort時追加-p containerPort由 Docker 自動分配宿主機端口container.inflight.ts環(huán)境變量env非空時先寫入臨時文件再以--env-file方式傳入container.inflight.ts 與 createEnvFile卷掛載對volumes逐項追加-vcontainer.inflight.tsentrypoint 覆蓋配置了entrypoint時追加--entrypoint 值這正是本次測試的核心參數(shù)container.inflight.ts最后是鏡像標簽與args中的每一個參數(shù)container.inflight.ts。于是entrypoint.test.w中的配置最終展開為類似這樣的命令docker run -i --rm --name wing-ulid -p 3000 --entrypoint /bin/sh my-entrypoint-app:hash -c RESPONSEhello /usr/local/bin/node /app/index.js鏡像標簽與構建/拉取分流在預檢階段 packages/winglang/sdk/src/target-sim/container.ts 會根據(jù)image是否為本地路徑?jīng)Q定鏡像標簽若image是本地目錄如./my-docker-image鏡像標簽為${name}:${hash}其中hash取自顯式傳入的sourceHash或由sourcePattern限定范圍后對源文件計算 MD5fs.md5(props.image, props.sourcePattern)若image是公共鏡像名如hashicorp/http-echo鏡像標簽直接使用該名稱。運行時prepareImage 先嘗試docker inspect檢查鏡像是否已存在已存在則直接復用不存在時本地目錄走docker build -t tag dir鏡像名走docker pull tag。這意味著本地 Dockerfile 變更會因源碼哈希變化而自動觸發(fā)重建這是sourcePattern/sourceHash參數(shù)存在的原因。hostPort 的生成與就緒等待hostPort是資源在預檢階段創(chuàng)建的 token 屬性container.ts僅當配置了containerPort時才存在。容器啟動后模擬器通過 start() 中的waitUntil循環(huán)每 100ms 檢查一次容器狀態(tài)總超時 30 秒見 waitUntil普通網(wǎng)絡模式下通過docker inspect讀取NetworkSettings.Ports中containerPort/tcp對應的HostPort拿到映射后的宿主機端口使用network: host時宿主機端口與容器端口相同container.inflight.ts這一行為在 network.test.w 中有專門的斷言expect.equal(networkHost.hostPort, 5678)。拿到端口后測試中的http.get(http://localhost:{entrypoint.hostPort!})才能命中容器內(nèi)的 3000 端口服務。容器中途意外退出會拋出 Container stopped unexpectedly 錯誤。五、容器生命周期與快照中的 WARNING 日志解讀快照第二行是[WARNING] container with entrypoint | Timeout waiting for container root/Default/with-entrypoint to shutdown, removing forcefully它來自容器關閉邏輯而不是測試失敗——測試本身最終標記為pass。關閉流程在 kill() 中實現(xiàn)模擬器先向 docker 子進程發(fā)送SIGTERM優(yōu)雅退出信號并等待 2 秒若容器在 2 秒內(nèi)未退出則觸發(fā)超時分支打印上述 WARNING 日志并執(zhí)行docker rm -f containerName強制刪除container.inflight.ts。這里的root/Default/with-entrypoint是資源在 Wing 應用樹中的完整路徑with-entrypoint正是源碼中as with-entrypoint指定的顯示 ID。本測試中的容器以/bin/sh作為入口shell 進程對 SIGTERM 的響應路徑導致容器未在 2 秒內(nèi)完成優(yōu)雅退出因此出現(xiàn)了強制移除的警告——這是模擬器保證資源及時釋放的兜底機制并非錯誤。相比之下Dockerfile 中的index.js顯式注冊了 SIGINT 處理process.on(SIGINT, ...)說明對信號響應良好的服務可以更平滑地關閉。六、狀態(tài)保留與更多實戰(zhàn)配置sim.Container還支持跨模擬器重啟保留數(shù)據(jù)。官方文檔 container.md 指出關閉 Wing Console 時所有容器都會被停止并移除要讓容器狀態(tài)在重啟后保留可以掛載匿名卷new sim.Container( name: my-service, image: ./my-service, containerPort: 8080, volumes: [/var/data], );其實現(xiàn)機制在 container.inflight.ts以/開頭且不含:的卷路徑被識別為匿名卷Wing 會為它生成wing-volume-ulid的命名卷并通過狀態(tài)文件state.jsoncontainer.inflight.ts記錄路徑與卷名的映射下次啟動時復用同一命名卷。這一模式在 mount.test.w 中以postgres:15鏡像 /var/lib/postgresql/data數(shù)據(jù)目錄的形式給出了實際用例同時展示了env傳POSTGRES_PASSWORD的寫法。其他相關測試用例還包括container.test.w同時驗證公共鏡像拉取hashicorp/http-echo與本地目錄構建兩種模式并分別斷言bang\n與Hello, Wingnuts!響應network.test.w驗證network: host模式下hostPort直接等于containerPortpull-failure.test.w 與 build-failure.test.w分別用非法鏡像協(xié)議foo://do-not-pull-me和不存在的構建目錄驗證失敗路徑。七、運行與驗證方式在倉庫環(huán)境中這些容器測試屬于 Hangar 端到端測試體系按 tools/hangar/README.md 的說明在 Wing 開發(fā)流程中執(zhí)行。直接驗證本文示例的方式是確保本機 Linux 環(huán)境已安裝并運行 Docker 守護進程然后對 entrypoint.test.w 執(zhí)行wing test并指定sim目標。若輸出與 entrypoint.test.w_test_sim.md 快照一致即pass ─ entrypoint.test.wsim ? root/Default/test:container with entrypoint、Tests 1 passed (1)則說明自定義entrypointargs的容器編排正確生效。需要說明的是sim.Container是模擬器專屬資源對應winglang/sdk.sim.Container不參與tf-aws等云端目標的資源生成因此這類容器編排通常用于本地開發(fā)聯(lián)調(diào)與回歸測試云端部署仍需借助平臺提供的容器工作負載能力。贊分享編程語言編譯器云原生語言運行時【免費下載鏈接】wingA programming language for the cloud ?? A unified programming model, combining infrastructure and runtime code into one language ?項目地址https://gitcode.com/gh_mirrors/wi/wing點擊查看免費下載相關推薦Wing 容器 Entrypoint 快照測試解析從 sim.Container 參數(shù)到 tf-aws 編譯產(chǎn)物Wing 容器 Entrypoint 快照測試解析從 sim.Container 參數(shù)到 tf aws 編譯產(chǎn)物 導讀 本文圍繞 Wing 倉庫中 hanga編程語言編譯器云原生語言運行時Wing 模擬器容器測試全解從 sim.Container 到 hangar 快照的端到端驗證Wing 模擬器容器測試全解從 sim.Container 到 hangar 快照的端到端驗證 本文圍繞 Wing 倉庫中 sim.Container 資源在編程語言編譯器云原生語言運行時Wing 容器資源深度解析從 hangar 編譯快照看 sim.Container 在 tf-aws 與模擬器目標下的行為Wing 容器資源深度解析從 hangar 編譯快照看 sim.Container 在 tf aws 與模擬器目標下的行為 本文以倉庫 tools/hanga編程語言編譯器云原生語言運行時上一篇fre:ac免費音頻轉(zhuǎn)換器跨平臺終極指南與實用教程下一篇Taro Runner 公用工具函數(shù)解析tarojs/runner-utils 的 Sass 注入、多端文件解析與 Vite 編譯上下文創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考