Docker 設定


我們各種軌道的工具都是以 Docker 映像檔的形式部署。

每一項工具都需要一份 Dockerfile,用來說明這個機器如何建置。它應該放在儲存庫的根目錄,並且命名為Dockerfile。

Dockerfile 應該建立出讓工具正確且迅速運作所需的最小映像檔。我們的最佳實務頁面有很多技巧可以幫你達成這個目標。

執行

逾時

測試執行器在每個解答的 20 秒執行期間內,可以取得 100% 的 CPU 與 3GB 的記憶體。20 秒之後,行程會遭到中止,並回報逾時以及 408 錯誤代碼。

Note

我們強烈建議遵循我們的效能最佳實務文件,以降低逾時的機會。

標準輸出/標準錯誤

一次工具執行最多可以產生 1MB 的標準輸出與標準錯誤。如果超過這個上限,就會以 413 錯誤代碼終止。

每次執行所產生的stdout和stderr內容都會存放在檔案中。你可以將包含除錯資訊的results.out檔寫入輸出目錄。

Caution

目前維護者無法查看這些檔案的內容。

結果

結果檔案不得大於 500 KB(包含任何堆疊追蹤等等)。如果檔案超過這個大小,這次工具執行就會以 460 錯誤代碼終止。

設定

每個解答在 20 秒的期間內可以取得 100% 的機器資源。20 秒之後,行程會遭到中止並回報為逾時。

有些工具需要(稍微)偏離預設設定。如果需要,這些設定會寫在 Tooling Invoker 儲存庫的 tools.json 檔案中。

網路

工具在執行時無法連上網際網路。你可以使用兩種不同的設定:

  1. none。這會停用容器內的網路裝置。
  2. internal。這會在容器內新增一個網路裝置,但這個網路無法存取任何外部資源。

不同語言在不同設定下的效能各有優劣(例如 Ruby 在 none 時快 2 倍。Elixir 在 internal 時快 12x。

你可以在本機執行 docker 時使用--network參數來做實驗。預設支援--network none。若要使用內部網路,請先執行docker network create --internal internal建立網路,然後在執行容器時使用--network internal。

記憶體

語言可以設定執行工作所需的記憶體上限。把這個值設得越低,我們就能越快平行執行越多工作。這也代表想濫用記憶體的人無法得逞。不同語言所需的記憶體上限差異極大。我們建議也感謝你對 docker 執行的執行過程進行基準測試,以找出它使用的記憶體上限。

記憶體應以加上 b、k、m、g 後綴的數字來指定,分別代表位元組、千位元組、百萬位元組或十億位元組。

在本機執行 Docker

你可以用這個指令測試上面的設定:

docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/

編輯 Dockerfile

所有對 Dockerfile 的變更都需要 @exercism/maintainers-admin 團隊進行 PR 審查,以避免引入安全漏洞。