VS Codeのエージェントモードを拡張するには、を試してください!

コンテナーツールに関するヒントとテクニック

この記事では、Visual Studio Codeのコンテナーツール拡張機能に関するトラブルシューティングのヒントとテクニックを説明します。コンテナーの設定と作業の詳細については、概要およびNode.jsPython、またはASP.NETのクイックスタート記事を参照してください。

非ルートユーザーとして実行する

セキュリティ上の理由から、Containers: Add Docker Files to Workspace... コマンドを実行する際にデフォルトのポートを選択するか、可能な限り1023より**大きい**ポートを選択することをお勧めします。これにより、VS CodeはDockerfileを非ルートアクセスで構成し、悪意のあるユーザーがコンテナー内で権限を昇格させるのを防ぐことができます。ポート選択がない場合でも、コンテナーツール拡張機能はデフォルトで非ルートアクセスを構成します。すべての場合において、アプリケーションによって変更または使用される各リソース (ポートやファイルなど) が、コンテナー内の非ルートユーザーによってアクセスできることを確認する必要があります。

ワークスペースにDockerfileを追加する際に1024未満のポートを選択すると、コンテナーツール拡張機能はコンテナーを非ルートユーザーとして実行するDockerfileを**作成できません**。これは、この範囲のポートが**ウェルノウンポート**または**システムポート**と呼ばれ、ネットワークソケットをIPアドレスにバインドするためにroot 権限で実行する必要があるためです。

Containers: Add Docker Files to Workspace... コマンドは、システムポート以外のポートを選択した場合、非ルート権限を設定します。現在のDockerfileとtasks.jsonが非ルートでの使用に設定されていない場合は、**Containers: Add Docker Files to Workspace...** コマンドを実行し、1023より**大きい**ポートを選択してみてください。このコマンドは、現在のDockerfileとtasks.jsonを上書きします。**Python: General**のような一部のプロジェクトタイプでは、引き続きDockerfileとtasks.jsonを変更する必要がある場合があります。Dockerfile内で、**システム以外のポート**を公開し、アプリコードの作業ディレクトリを作成し、アプリディレクトリにアクセスできる非ルートユーザーを追加する必要があります。公開されたポートが参照されているすべての場所で更新されていることを確認してください。以下の例では、公開されたポートと一致するようにGunicornポートを更新する必要がありました。

# 1024 or higher
EXPOSE 1024

# ... other directives such as installing requirements.txt file

# Creates /app in container if it does not already exist
# Ports code into /app
WORKDIR /app
ADD . /app

# Creates a non-root user and adds permission to access the /app folder
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

CMD ["gunicorn", "--bind", "0.0.0.0:1024", "pythonPath.to.wsgi"]

次に、tasks.json内のdocker runタスクも同じポートを想定していることを確認してください。通常、tasks.json内で古いポート番号の出現箇所を検索し、新しいポート番号に置き換えることができます。以下の例は、Python Djangoアプリの場合に必要な変更を示しています。

{
  "type": "docker-run",
  "label": "docker-run: debug",
  "dependsOn": ["docker-build"],
  "python": {
    "args": [
      "runserver",
      "0.0.0.0:1024", //<- Change the number after the colon
      "--nothreading",
      "--noreload"
    ],
    "file": "manage.py"
  }
}

Linuxで「connect EACCES /var/run/docker.sock」エラーが発生する

VS Codeは非ルートユーザーとして実行されるため、拡張機能からDockerにアクセスするには、Linuxのインストール後の手順の「非ルートユーザーとしてDockerを管理する」の手順に従う必要があります。

コンテナーとイメージがコンテナーエクスプローラーから消えた

これは、Docker Explorerと呼ばれる別の拡張機能 (Microsoft製ではありません) との競合が原因である可能性が高いです。この問題を解決するには、vscode-docker issue #1609で説明されている回避策を使用してください。

拡張機能がリモートマシンでDockerを見つけられない

エラーメッセージ「Failed to connect. Is Docker installed and running?」

  1. リモートマシンにDockerエンジンが**インストールされている**こと、およびDocker CLIが動作すること (ターミナルからdocker psを実行し、エラーが返されないことを確認してください) を確認してください。
  2. リモート開発環境 (SSH経由のリモートマシン、WSLサブシステム、GitHub Codespaces) を使用している場合は、コンテナーツール拡張機能がリモートだけでなくローカルにもインストールされていることを確認してください。

無効なURLエラー

リモートのDockerデーモンに接続する必要がある場合は、設定のcontainers.environment属性の代わりにDockerコンテキストを使用することをお勧めします。リモートのDockerデーモンと通信するためのコンテキストの作成と使用方法については、このガイドを参照してください。

現在使用しているDockerコンテキストを上書きする必要がある場合は、DOCKER_HOST環境変数またはcontainers.environment.DOCKER_HOST属性にURLのプロトコル (例: ssh://myuser@mymachineまたはtcp://1.2.3.4) が含まれていることを確認してください。

注: containers.environment.DOCKER_HOST属性はDockerコンテキストを上書きし、DOCKER_HOST環境変数はcontainers.environment.DOCKER_HOST属性とDockerコンテキストの両方を上書きすることに留意してください。

ヒント: PowerShellでは、$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'を使用してDocker環境変数を変更できます。

質問とフィードバック

フィードバックをお待ちしております!アイデアや提案があれば、問題を報告してください。