コンテナツールのヒントとコツ

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

root 以外のユーザーとして実行する

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

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

システム以外のポートを選択した場合、Containers: Add Docker Files to Workspace... コマンドによって非 root 権限が設定されます。現在の Dockerfile と tasks.json が非 root 用に設定されていない場合は、Containers: Add Docker Files to Workspace... コマンドを実行し、1023 より大きいポートを選択してみてください。このコマンドは、現在の Dockerfile と tasks.json を上書きします。Python: General などの一部のプロジェクト タイプでは、引き続き Dockerfile と tasks.json の変更が必要になる場合があります。Dockerfile 内で、システム以外のポートを公開し、アプリコード用の作業ディレクトリを作成し、アプリディレクトリへのアクセス権を持つ非 root ユーザーを追加する必要があります。公開されたポートが参照されている場所はすべて更新してください。以下の例では、公開されたポートに合わせて 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.jsondocker 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 は非 root ユーザーとして実行されるため、拡張機能から Docker にアクセスするには、Linux のインストール後の手順の「非 root ユーザーとして Docker を管理する (Manage Docker as a non-root user)」の手順に従う必要があります。

コンテナとイメージが Container Explorer から消えている

これは、(Microsoft 製ではない) Docker Explorer という別の拡張機能との競合が原因である可能性が最も高いです。この問題を解決するには、vscode-docker の問題 #1609 に記載されている回避策を使用してください。

拡張機能がリモートマシン上の Docker を検出しない

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

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

無効な 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 環境変数を変更できます。

質問とフィードバック

皆様からのフィードバックをお待ちしております!アイデアやご提案がございましたら、問題を報告してください。

© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.