今回より、ロギング機能を提供する ロギングサービスコンテナ の構築に着手します。
コンテナ内で開発作業(コーディング や デバッグ)を行うことを目標とし、Git(ローカルリポジトリ)による バージョン管理 も実施します。
作業内容は以下のとおりです。
かなりの量なので、前中後 の3編に分けて説明していきます。
前編
A. ファイルのエンコードと改行コード
B. ロギングサービス コンテナの作成
C. VSCode からのリモート接続
中編
D. Git(ローカルリポジトリ)でのバージョン管理
E. サンプルプログラムの作成
F. サンプルプログラムのデバッグ
後編
G. ロギングサービス メイン処理の作成
H. ログ出力のテスト
A. ファイルのエンコードと改行コード
大多数の人は、Linuxベースのイメージ から開発用コンテナを作成すると思います。
ここで問題になるのはファイルのエンコードと改行コードです。
Linuxベースのイメージを利用する際は次のように設定した方が良いでしょう。
エンコード: UTF-8
改行コード: \n - LFコード(0x0A)
VSCode の設定
VSCode の既定の改行コードは「auto(OS固有の改行文字)」なので、Windowsの場合「改行文字 = \r\n - CRLFコード(0x0D, 0x0A)」となってしまいます。
前述の UTF-8 と \n - LFコード(0x0A) をsettings.json という定義ファイルに記述し、VSCode で作成するすべてのファイルの「既定の設定」としておきましょう。
プロダクトフォルダ sample-product 直下に .vscode フォルダを作成し、そこへ settings.json という名前の定義ファイルを作成してください。
C:\...\sample-product
├─ .vscode
│ settings.json
│
│ .env
│ docker-compose.yml
│
└─valkey
valkey.conf
ファイルの内容
このファイル自体も、以下の設定で作成してください。
エンコード: UTF-8
改行コード: \n - LFコード(0x0A)
{
// VSCode は JSON with Comments (jsonc) をサポートしているため、
// コメント行を記述することが可能です。
"files.eol": "\n", // 改行コードをLFに設定
"files.encoding": "utf8" // 既定のエンコードをUTF-8に設定
}
新規作成ファイルの エンコード と 改行コード
sample-product フォルダを VSCode で開くと、settings.json の内容が既定値として扱われます。
「ファイル」メニューの「新しいテキストファイル」や「新しいファイル」をクリックしてエディタ画面を開くと、最初から UTF-8 と \n - LFコード(0x0A) が適用されます。
既存ファイルのエンコード・改行コードの変更方法
VSCode で変更したいファイルを開いた後、ウィンドウ右下の Shift JIS および CRLF をクリックして変更します。
本当は 前回 の記事中で対処すべきでしたが、すっかり失念していました。
次のファイルの エンコード と 改行コード も UTF-8 と \n - LFコード(0x0A) に変更しておいてください。
- .env
- docker-compose.yml
- valkey/valkey.conf
⑥ UTF-8 および LF に切り替わったことを確認した後、ファイルを保存する。

B. ロギングサービス コンテナの作成
ログ出力要求を受け取り、データベースへログメッセージを保存する Docker コンテナを構築します。
作成する Dockerコンテナ
- ロギングサービス(logging-service)
フォルダ構成
デバッグ用途の専用ファイル docker-compose_dbg_log.yml と、ソースコード ファイルを配置する loggging フォルダを作成します。
このフォルダの下には、.devcontainer および src フォルダを作成しておきます。
C:\...\sample-product
├─ .vscode
│ settings.json
│
│ .env
│ docker-compose.yml
│ docker-compose_dbg_log.yml
│
├─logging
│ ├─.devcontainer
│ │ devcontainer.json
│ │
│ │ Dockerfile
│ │ requirements.txt
│ │
│ └─src
│
└─valkey
valkey.conf
新規:Dockerfile
ビルド用のベースイメージ
公式の Pythonイメージ(Python 3.12 slim版)をベースとします。
最初から各種モジュールが導入されている通常版でも良かったのですが、今回は不要なパッケージを取り除いた slim版 へ 開発用パッケージ を個別にインストールすることにします。
Gitのインストール
VSCode でコンテナへリモート接続し、プログラムのコーディングを実施します。
各ファイルのバージョン管理も 同VSCode内から実施するのが自然と思われ、コンテナ内部に Gitパッケージを導入しておきます。
リモート接続していない状態で Git によるバージョン管理を実施する、という考え方もあるでしょう。
賛否が分かれそうな お話ですが、ここでは「開発用コンテナのソースファイルのバージョン管理は、リモート接続後の VSCode内で実施する」ということにします。
開発用ユーザー/グループの作成
非ルート権限の一般ユーザー/グループ を作成しておきます。
VSCode からは、この devuser(別の名前でも可)でリモート接続を行います。
ファイルの内容
# 公式Pythonイメージ の slim 版 を使用。
FROM python:3.12-slim-bullseye
# 環境変数を設定
# ・Python 標準入出力のバッファリングを無効化。
# ・コンパイル後のバイナリファイル(.pyc)を生成しない。
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1
# 非rootユーザー(devuser) が pipでインストールしたコマンドを利用できるよう、
# 同ユーザーの bin フォルダ をPATH環境変数へ追加。
ENV PATH="/home/devuser/.local/bin:${PATH}"
# コンテナ内での作業フォルダを指定。
WORKDIR /app
# Gitをインストール
# ・apt-get updateでパッケージリストを更新
# ・gitをインストール
# --no-install-recommends : 不要な推奨パッケージはインストールしない
# ・aptのキャッシュを削除
RUN apt-get update && \
apt-get install -y --no-install-recommends git && \
rm -rf /var/lib/apt/lists/*
# 開発用ユーザーとグループを追加
# devuser : VSCodeからリモート接続する際に使用するユーザー名
# 1000 : ユーザー名の UID/GID
ARG USERNAME=devuser
ARG USER_UID=1000
ARG USER_GID=1000
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& chown -R $USERNAME:$USERNAME /app
###--- これ以後は、開発用ユーザー でコマンドを実行 ---
# 実行ユーザーを 開発用ユーザー に変更
USER $USERNAME
# Python の依存関係ファイルを元に、必要なライブラリをインストール
# ・requirements.txt を コンテナ内の ${WORKDIR} 直下にコピー
# ・依存ライブラリをインストール
# --no-cache-dir : 不要なキャッシュは行わない
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Python アプリケーションのソースファイルをコピー
# ・srcフォルダ下の内容を コンテナ内の ${WORKDIR}/src 直下にコピー
COPY ./src ./src
# コンテナ起動時に実行するコマンド
# ※ docker-compose.ymlの'command' で上書きされる。
CMD ["python", "src/logging_main.py"]
新規:requirements.txt
ログ出力用 Python プログラムで使用する ライブラリ を記述します。
valkey
psycopg2-binary
新規:docker-compose_dbg_log.yml
開発用コンテナとしての設定を追加していますが、基本的な形は 前回 の Docker-compose.yml と変わりありません。
主な変更点は次のとおりです。
① コンテナの自動再起動を無効化する
開発中のコンテナは強制終了することもあり、それを検知して勝手に再起動されると作業に支障が出る場合もあります。
そのため、restart: always 指定はコメントアウトしておきます。
② メイン処理(Pythonプログラム)を実行しない
tail -f /dev/null
tail /f はデータ末尾を監視して表示し続けるコマンドですが、/dev/null は書き込みデータを破棄して読み込み要求には何も返却しないという 特別なデバイス です。
このコマンドはコンテナのメインプロセスとして実行され、何もせずに待機し続けます。
これにより、Dockerfile の CMD で指定されたアプリケーションの自動起動を抑制し、VSCodeから接続して任意の操作(デバッグなど)を行うための『待機状態』を作り出します。
③ ソースフォルダ src をマウントする
ホスト側のソースフォルダ src を、コンテナ内部に直接マウントします。
再ビルドしなくても修正内容がコンテナ側へ即反映されますし、コンテナが破棄されたとしてもソースファイルはホスト側のフォルダに残ります。
ファイルの内容
services:
#----------------------------------------
# ロギング サービス
#----------------------------------------
logging-service:
build:
context: ./logging # Dockerfile 配置フォルダ
dockerfile: Dockerfile # Dockerfile 名
image: ${LOGGING_IMAGE_NAME} # ビルドイメージ名(タグ名)
container_name: ${LOGGING_CONTAINER_NAME} # コンテナ名
# サーバー再起動時やエラー発生時に自動でコンテナを再起動する。
# 開発作業に使用をきたす場合はコメントアウトすること。
#restart: always
# ★ 勝手に再起動されると支障が出るのでコメントアウト。
environment:
LOG_LEVEL: ${LOGGING_LOG_LEVEL} # ログ出力レベル
TZ: Asia/Tokyo # コンテナ全体を日本時間に設定
# PostgreSQL 接続情報
DB_HOST: db-service # サービス名
DB_PORT: 5432 # 既定のポート番号
DB_NAME: ${POSTGRES_DB} # データベース名
DB_USER: ${POSTGRES_USER} # データベースユーザー名
DB_PASSWORD: ${POSTGRES_PASSWORD} # データベースパスワード
# Valkey 接続情報
VALKEY_HOST: valkey-service # サービス名
VALKEY_PORT: 6379 # 既定のポート番号
VALKEY_PASSWORD: ${VALKEY_PASSWORD} # 認証パスワード
volumes:
# 修正を即時反映するため、ホスト側のソースフォルダをコンテナ内部の
# 「/app」にバインドする。
# 本番環境 構築時には不要なので削除すること。
- ./logging/src:/app/src
networks:
# コンテナ間 専用ネットワーク
- my_sample_network
# /dev/null ファイルを監視し続けるコマンド。
# 何もせずに待機し続けるため、コンテナがすぐに終了してしまうのを防ぐ。
# 本番環境 構築時には不要なので削除すること。
command: tail -f /dev/null
#********************************************************
# 独自ネットワークの定義
#********************************************************
networks:
my_sample_network:
既存:.env
ロギングサービス用の環境変数定義を追加します。
LOGGING_LOG_LEVELは、このサービスから出力可能なログレベルを表します。
例えばWARNINGと記述した場合、DEBUG や INFO レベルのログは保存されずに破棄されます。
#----------------------------------------
# ロギング サービス
#----------------------------------------
LOGGING_IMAGE_NAME=logging-image # イメージ名
LOGGING_CONTAINER_NAME=logging-container # コンテナ名
LOGGING_LOG_LEVEL=DEBUG # 出力可能なログレベル
# (DEBUG, INFO, WARNING, ERROR, CRITICAL)
コンテナの起動と終了
このコンテナは VSCode からリモート接続して使用しますが、コンテナ単体で起動 および 終了することも可能です。
ただし起動直後に実行されるコマンドは tail -f /dev/null です。待機状態が継続されるだけなので、現時点ではあまり意味がありません。
起動(docker compose up -d)
既定のファイル名(docker-compose.yml)とは異なるので、起動コマンドには 本開発コンテナをデバッグするための docker compose ファイル名を指定します。
C:\...\sample-product>docker compose -f docker-compose_dbg_log.yml up -d
(中略)
[+] Running 2/2
✔ logging-image Built 0.0s
✔ Container logging-container Started 0.3s
終了(docker compose down)
起動時と同様に、本開発コンテナをデバッグするための docker compose ファイル名を指定します。
C:\VSCodeProjects\sample-product>docker compose -f docker-compose_dbg_log.yml down
[+] Running 2/2
✔ Container logging-container Removed 10.4s
! Network sample-product_my_sample_network Resource is still in use 0.0s
Network が削除されませんでしたが、これはデータベースコンテナで使用中のリソースのためです。放置しても動作に支障はありません。
C. VSCode からのリモート接続
ロギングサービス コンテナへリモート接続し、プログラムの作成とデバッグを行うための環境を整えます。
前提条件
- Git インストール済み
- VSCode インストール済み
- VSCode への拡張機能の導入
- Japanese Language Pack
- GitLens
VSCode 拡張機能 インストール済みペイン の様子

注)AIサポート用 拡張機能(Roo Code)の導入は任意です。
拡張機能(コンテナ操作・リモート接続)の導入
ホストOSの VSCode へ次の拡張機能を導入します。
-
Container Tools
Dockerコンテナ環境を操作するための拡張機能 -
Remote Development
リモート接続&デバッグ を行うための拡張機能
導入後の VSCode 拡張機能 インストール済みペイン の様子

1. Dockerコンテナ環境を操作するための拡張機能
- コンテナアプリケーションの構築、管理、デプロイをサポート。
- コンテナ・イメージ・ボリュームの直感的に管理できる GUI を提供。
- Dockerfileの編集を支援。
- コンテナ内の Node.js/Python/.NETアプリケーションをワンクリックでデバッグ可能。
2. リモート接続&デバッグ を行うための拡張機能
- リモート環境(SSH、コンテナ、WSL)での開発を実現する拡張機能群のパック。
- ローカルPCを使わず、リモート環境だけで開発をすすめることが可能。
- ローカルでVS Codeを使っている時と同じように、拡張機能・テーマ・キーバインドなどを利用可能。
この拡張パックには、下表の拡張機能が含まれています。
| 名称 | 説明 |
|---|---|
| Dev Containers |
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers Dockerコンテナ内で一貫した開発環境を構築し、アプリケーションを開発・デバッグできます。プロジェクトごとに異なる依存関係やツールを分離できます。 |
| Remote - SSH |
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh SSH接続を通じて、物理サーバーや仮想マシン上のファイルを開き、リモートでアプリケーションを開発・デバッグできます。 |
| Remote - Tunnels |
https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server リモートマシンに接続し、VS Codeで開発を行えます。SSH接続やコンテナ設定が不要で、ファイアウォールやプロキシの背後にあるマシンにもアクセス可能です。 |
| WSL |
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl Windows Subsystem for Linux (WSL) 上で、Linuxのファイルシステムやツールを活用しながら、VS Codeで開発を行えます。 |
設定方法
Dev Containers は VSCode用の「サーバーコンポーネント」をコンテナ内で起動し、リモート接続元の VSCode の代わりにファイル操作やターミナル操作、デバッグなどの機能を実行します。
新規:devcontainer.json
ロギングサービス用のフォルダ logging の直下に .devcontainerフォルダを作成します。
拡張機能 Dev Containers はこのフォルダ内の devcontainer.json を参照し、VSCode から接続するコンテナを操作します。
① コンテナの名前(VS Code上での表示名)
リモート接続後の VSCode に表示されるツリーエントリの名称です。
任意の名称を指定可能です。
下図は"name": "logging service"と記述した時の表示例です。

② docker-compose ファイルと接続先サービス名
docker-compose_dbg_log.yml ファイルを、.devcontainerフォルダを起点とする相対パスで指定します。
また、接続先サービス名 logging-service も記述します。
"dockerComposeFile": [
"../../docker-compose_dbg_log.yml"
],
"service": "logging-service",
③ リモート環境に導入するVSCode拡張機能
リモート接続したVS Codeには拡張機能を導入できますが、手動でのインストールは手間がかかり、利用者の利便性を損ねます。
本ファイルに拡張機能を記述しておくことで、リモート接続開始直後から自動で導入できます。
自動導入する拡張機能
| 名称 | 概要 |
|---|---|
| ms-python.python | Python開発のための拡張機能。デバッグやコードナビゲーションなど、基本的な機能を提供します。 |
| ms-python.vscode-pylance | Pythonの言語サーバー。ms-python.pythonと連携して、高速なコード補完やリファクタリング機能などを提供します。 |
| charliermarsh.ruff | Pythonの超高速なLinterおよびFormatter。コード品質の維持と自動整形を支援します。 |
| eamodio.gitlens | Gitの機能をVS Codeに統合する拡張機能。Git操作を強力にサポートします。 |
| rooveterinaryinc.roo-cline | オープンソースのAIコーディングアシスタント拡張機能。 注)本拡張機能が不要な時は削除してください。 |
導入後の VSCode 拡張機能 インストール済みペイン の様子

ファイルの内容
{
// VSCode は JSON with Comments (jsonc) をサポートしているため、
// コメント行を記述することが可能です。
// コンテナの名前(VS Code上での表示名)
"name": "logging service",
// プロジェクトルートにあるdocker-compose_dbg_log.ymlを指定
// (.devcontainerフォルダから見て2階層上にあるため '../../' を付加)
"dockerComposeFile": [
"../../docker-compose_dbg_log.yml"
],
// 接続するサービスの名前
"service": "logging-service",
// コンテナ内のワークスペース(作業フォルダ)
"workspaceFolder": "/app",
// VS Codeのカスタマイズ設定
"customizations": {
"vscode": {
// コンテナ内に自動でインストールする拡張機能
"extensions": [
"ms-python.python", // Python言語サポート
"ms-python.vscode-pylance", // 高機能なコード補完・分析
"charliermarsh.ruff", // 高速なリンター&フォーマッター
"eamodio.gitlens", // Git機能の強化
"rooveterinaryinc.roo-cline" // Roo Code(開発用 AIエージェント)
],
// VS Codeエディタのコンテナ内での設定
"settings": {
// Ruffをデフォルトフォーマッターに設定
"[python]": {
"python.formatting.provider": "ruff",
"editor.formatOnSave": true
},
// Ruffの自動修正を有効化
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
}
}
}
},
// 開発コンテナに接続するユーザーを指定
// Dockerfile で作成した 'devuser'ユーザーを指定する。
"remoteUser": "devuser"
}
コンテナの起動と接続
VSCodeからコンテナを起動し、同時にリモート接続してみます。
① 新しい VSCode を起動し、loggingフォルダを開きます。
C:\...\sample-product
├─ .vscode
│ settings.json
│
│ .env
│ docker-compose.yml
│ docker-compose_dbg_log.yml
│
├─logging ★リモート接続するVSCodeから開くフォルダ★
│ ├─.devcontainer
│ │ devcontainer.json
│ │
│ │ Dockerfile
│ │ requirements.txt
│ │
│ └─src
│
└─valkey
valkey.conf
② 確認ダイアログが表示されたら「はい、作成者を信頼します」をクリックします。
Dockerfile と requirements.txt が配置されていますが、srcフォルダ下には まだ何のファイルも格納されていません。
次回以降、src フォルダ下に Python プログラムファイルを作成していきます。
③ 画面左端のアイコン一覧の Containers アイコンをクリックします。
CONTAINERSペインの表示内容
docker-compose.yml でデータベースコンテナを起動していた場合、3つのコンテナが稼働状態で表示されます。

④ コマンドパレットから「コンテナーをリビルドして開く」を選択します。
選択すると、Dockerイメージの作成 および コンテナのビルドが始まります。
ビルドが正常に終了すると自動的にコンテナへの接続が行われ、エクスプローラの表示が切り替わります。
リビルドが終了してコンテナへ接続した後の エクスプローラーペイン

ルート項目が APP [開発コンテナー: LOGGING SERVICE @ DESKTOP-LINUX]に切り替わりました。先頭の APP は Dockerfile に記述した 「WORKDIR /app」を指しています。
つまり、このツリーは コンテナー内部の作業フォルダ配下 を表示している状態です。
また、ターミナルペインの表示も下図の様に切り替わります。
プロンプト表記から、開発用ユーザー devuser で Shell を実行していることが分かります。

コンテナの停止と切断
VSCodeからコンテナを停止してリモート接続を終了してみます。
① 画面左下の「開発コンテナー」という緑色の表記部分をクリックします。

② コマンドパレットが開くので、「リモート接続を終了する」を選択します。

リモート接続が終了すると、VSCodeは起動直後の状態(フォルダーを開く前の状態)に戻ります。

終わりに
ロギングサービス コンテナを作成し、VSCode からリモート接続できる環境が整いました。
次回は これまでに作成したファイルを Git でバージョン管理すると共に、コンテナへリモート接続した VSCode 上で簡単な Python プログラムの作成&デバッグを試してみることにします。






