コンテナツールのヒントとコツ
この記事では、Visual Studio Code の Container Tools 拡張機能のトラブルシューティングのヒントとコツについて説明します。コンテナの設定と操作の詳細については、概要および Node.js、Python、ASP.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.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 は非 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?"
- リモートマシンに Docker エンジンがインストールされており、Docker CLI が機能していることを確認します (ターミナルから
docker psを実行し、エラーが返されないことを確認します)。 - リモート開発環境 (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 環境変数を変更できます。
質問とフィードバック
皆様からのフィードバックをお待ちしております!アイデアやご提案がございましたら、問題を報告してください。