Docker ツール ヒントとテクニック
この記事では、Visual Studio Code Docker 拡張機能のトラブルシューティングのヒントとテクニックについて説明します。Docker のセットアップと操作の詳細については、概要 および Node.js、Python、または ASP.NET のクイックスタート記事を参照してください。
非 root ユーザーとして実行する
セキュリティ上の理由から、[ワークスペースに Dockerfile を追加] コマンドを実行するときはデフォルトのポートを選択するか、可能な場合は常に 1023 より大きいポートを選択することをお勧めします。これにより、VS Code は非 root アクセスで Dockerfile を構成し、悪意のあるユーザーがコンテナ内のアクセス許可を昇格させるのを防ぐことができます。場合によっては、ポートの選択がないため、Docker 拡張機能はデフォルトで非 root アクセスを構成します。いずれの場合も、アプリケーションによって変更または使用される各リソース (ポートやファイルなど) に、コンテナ内の非 root ユーザーがアクセスできることを確認する必要があります。
Dockerfile をワークスペースに追加するときに 1024 未満のポートを選択した場合、Docker 拡張機能はコンテナを非 root ユーザーとして実行する Dockerfile を作成できません。これは、この範囲のポートはウェルノウンポートまたはシステムポートと呼ばれ、ネットワークソケットを IP アドレスにバインドするには root 特権で実行する必要があるためです。
[ワークスペースに Dockerfile を追加] コマンドは、システムポート以外のポートを選択した場合、非 root 特権を設定します。現在の Dockerfile および tasks.json
が非 root ユーザー向けに設定されていない場合は、[ワークスペースに Dockerfile を追加] コマンドを実行して、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 を管理する」の手順に従う必要があります。
Docker コンテナとイメージが Docker ビューから消えた
これは、Docker Explorer
(Microsoft 製ではない別の拡張機能) という別の拡張機能との競合が原因である可能性が最も高いです。この問題を解決するには、vscode-docker issue #1609 で説明されている回避策を使用してください。
拡張機能がリモートマシン上の Docker を見つけられない
エラーメッセージ "接続に失敗しました。Docker がインストールされて実行されていますか?"
- Docker エンジンがリモートマシンにインストールされていること、および Docker CLI が動作することを確認してください (ターミナルから
docker ps
を実行し、エラーが返されないことを確認してください)。 - リモート開発環境 (SSH 経由のリモートマシン、WSL サブシステム、GitHub Codespace) を使用している場合は、Docker 拡張機能がローカルだけでなくリモートにもインストールされていることを確認してください。
無効な URL エラー
リモート Docker デーモンに接続する必要がある場合は、設定の docker.environment
属性の代わりに Docker コンテキストを使用することをお勧めします。リモート Docker デーモンと通信するためのコンテキストを作成して使用する方法については、このガイドを確認してください。
現在使用している Docker コンテキストをオーバーライドする必要がある場合は、DOCKER_HOST
環境変数または docker.environment.DOCKER_HOST
属性に URL にプロトコルが含まれていることを確認してください (例: ssh://myuser@mymachine
または tcp://1.2.3.4
)。
注:
docker.environment.DOCKER_HOST
属性は Docker コンテキストをオーバーライドし、DOCKER_HOST
環境変数はdocker.environment.DOCKER_HOST
属性と Docker コンテキストの両方をオーバーライドすることに注意してください。
ヒント: Powershell では、Docker 環境変数を
$ENV:DOCKER_HOST = 'ssh://username@1.2.3.4'
で変更できます。
質問とフィードバック
フィードバックをお待ちしております。アイデアや提案がある場合は、問題を報告してください。