コンテナツールのヒントとテクニック

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

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

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

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

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 へのインストール後の手順の「Manage Docker as a non-root user(非ルートユーザーとして Docker を管理する)」の手順に従う必要があります。

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

これは、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 Codespace)を使用している場合は、Container Tools 拡張機能がローカルだけでなくリモートにもインストールされていることを確認してください。

無効な URL エラー

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

現在使用している Docker コンテキストをオーバーライドする必要がある場合は、DOCKER_HOST 環境変数または containers.environment.DOCKER_HOST 属性の URL にプロトコルが含まれていることを確認してください(例: ssh://myuser@mymachinetcp://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 site is unofficial and not affiliated with Microsoft.