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