コンテナツールのヒントとテクニック
この記事では、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 を作成できません。これは、この範囲のポートがウェルノウンポートまたはシステムポートと呼ばれ、ネットワークソケットを 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?"
- 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 環境変数を変更できます。
質問とフィードバック
皆様からのフィードバックをお待ちしております!アイデアや提案があれば、問題を報告してください。