Dockerのセットアップ


トラックの各種ツールは、Dockerイメージとしてデプロイされています。

それぞれのツールには、マシンをどのように構築するかを指定するDockerfileが必要です。 Dockerfileはリポジトリのルートディレクトリに置き、名前はDockerfileにしてください。

Dockerfileは、ツールが正しく、すばやく動作するために必要な最小限のイメージを作成するようにしてください。 ベストプラクティスのページには、この目標を達成するためのヒントがたくさんあります。

実行

タイムアウト

テストランナーは、解答1つにつき20秒間の間、100%のCPUと3GBのメモリを利用できます。 20秒が経過すると、プロセスは停止され、408エラーコードとともにタイムアウトが報告されます。

Note

タイムアウトの可能性を減らすために、パフォーマンスのベストプラクティスに従うことを強くおすすめします。

標準出力と標準エラー出力

ツールの実行では、標準出力と標準エラー出力を合わせて最大1メガバイトまで出力できます。 それを超える出力があると、413エラーコードとともに強制終了されます。

各実行のstdoutとstderrの内容は、ファイルに保存されます。 出力ディレクトリには、デバッグ情報を含むresults.outファイルを書き込むこともできます。

Caution

現時点では、メンテナーがこれらのファイルの内容を閲覧することはできません。

結果

結果ファイルは500キロバイト以下でなければなりません(スタックトレースなどを含む)。 ファイルがこれより大きい場合、ツールの実行は460エラーコードとともに強制終了されます。

設定

各解答は、20秒間の間、マシンのリソースを100%利用できます。 20秒が経過すると、プロセスは停止され、タイムアウトとして報告されます。

一部のツールは、デフォルトの設定から(多少の)変更を必要とします。 その場合は、Tooling Invokerリポジトリのtools.jsonファイルで設定します。

ネットワーク

ツールはインターネットにアクセスできない状態で実行されます。使用できる設定は2つあります。

  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レビューが必要です。