Container Tools のヒントとコツ
この記事では、Visual Studio Code の Container Tools 拡張機能に関するトラブルシューティングのヒントとコツについて説明します。コンテナーの設定と操作の詳細については、概要および Node.js、Python、ASP.NET のクイックスタート記事を参照してください。
非ルートユーザーとして実行する
セキュリティ上の理由から、Containers: Add Docker Files to Workspace... コマンドを実行する際はデフォルトのポートを選択するか、可能な限り 1023 より大きいポートを選択することをお勧めします。これにより、VS Code は Dockerfile を非ルートアクセスで構成し、悪意のあるユーザーがコンテナー内で権限を昇格するのを防ぎます。ポート選択がない場合もありますが、Container Tools 拡張機能はデフォルトで非ルートアクセスを構成します。すべての場合において、アプリケーションによって変更または使用される各リソース (ポートやファイルなど) がコンテナー内の非ルートユーザーによってアクセス可能であることを確認する必要があります。
ワークスペースに Dockerfile を追加する際に 1024 未満のポートを選択すると、Container Tools 拡張機能はコンテナーを非ルートユーザーとして実行する Dockerfile を作成できません。これは、この範囲のポートはwell-knownまたはシステムポートと呼ばれ、ネットワークソケットを 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 のインストール後手順の「非ルートユーザーとして Docker を管理する」の手順に従う必要があります。
Container Explorer からコンテナーとイメージが消えた
これは、Docker Explorer (Microsoft が作成したものではない) という別の拡張機能との競合が原因である可能性が最も高いです。この問題を解決するには、vscode-docker issue #1609 に記載されている回避策を使用してください。
拡張機能がリモートマシンで Docker を見つけられない
エラーメッセージ "Failed to connect. Is Docker installed and running?"
- リモートマシンに Docker エンジンがインストールされており、Docker CLI が機能することを確認してください (ターミナルから
docker psを実行し、エラーが返されないことを確認してください)。 - リモート開発環境 (SSH 経由のリモートマシン、WSL サブシステム、GitHub Codespace) を使用している場合は、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 環境変数を変更できます。
質問とフィードバック
フィードバックをお待ちしております!ご意見やご提案がありましたら、問題を報告してください。