1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Docker】Seleniumでブラウザ操作ログの保存アプリ

Last updated at Posted at 2024-06-23

はじめに

Dockerについて学習したので、とりあえず動くものを作ってみましたメモ。

Dockerを使用してPython環境を構築し、Seleniumでブラウザ操作を行い、Google検索結果のヒット数を取得し、MySQLにログを保存します。

Dockerが立ち上がったらSeleniumのヘッドレスモードでブラウザ操作を行うので、GUI操作はないです。

↓このアプリのリポジトリ

ディレクトリ構成

seliniumApp/
│
├── Docker/
│   ├── web/
│   │   ├── app.py
│   │   ├── Dockerfile
│   │   └── requirements.txt
│   └── init.sql
├── docker-compose.yml

実行手順

プロジェクトのルートディレクトリに移動

cd seliniumApp

Dockerコンテナをビルドして起動

docker-compose up --build

結果の確認

下記コマンドでコンテナIDを確認して

docker ps

MySQLに接続して、ログが正しく保存されているか確認します。

docker exec -it <db_container_id> mysql -u root -p
USE web_logs;
SELECT * FROM logs;

healthcheckについて

このアプリを作成するにあたって一番詰まったところ。
DBサーバーが完全に立ち上がる前に、Webサーバーが立ち上がって検索数をDBに保存しようとしてしまうので、DBにうまくアクセスできず以下のログがでていました。

seliniumapp-web-1  | ブラウザを起動中...
seliniumapp-web-1  | データベースに接続中...
seliniumapp-web-1  | データベースエラー: 2003 (HY000): Can't connect to MySQL server on 'db:3306' (111)
seliniumapp-web-1  |     if cursor is not None:
seliniumapp-web-1  | NameError: name 'cursor' is not defined

DBサーバーが完全に立ち上がってからWebサーバーが立ち上がるようにhealthcheckの設定をおこないました。

docker-compose.yml

version: '3'

services:
  web:
    build:
      context: ./Docker
      dockerfile: ./web/Dockerfile
    volumes:
      - ./Docker/web:/app
    ports:
      - "8000:8000"
    environment:
      TZ: "Asia/Tokyo"
      DB_HOST: db
      DB_USER: root
      DB_PASS: mysql_pass
      DB_NAME: web_logs
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mysql:5.7
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      MYSQL_ROOT_PASSWORD: mysql_pass
      MYSQL_DATABASE: web_logs
    ports:
      - "3307:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

test

test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]

意味: コンテナの健康状態をチェックするために実行するコマンドを指定します。
mysqladmin ping -h localhost コマンドを実行し、MySQLサーバーにpingを送り、応答をチェックします。

interval

interval: 10s

意味: ヘルスケアチェックを実行する間隔を指定します。
10秒ごとにヘルスケアチェックが実行されます。

timeout

timeout: 5s

意味: ヘルスケアチェックのコマンドが実行される際のタイムアウト時間を指定します。
コマンドが5秒以内に完了しない場合、チェックは失敗と見なされます。

retries

retries: 5

意味: コンテナの状態が不健康と見なされる前にヘルスケアチェックが連続して失敗する回数を指定します。

ヘルスケアチェックが連続して5回失敗した場合、コンテナはチェック失敗と見なされます。

    depends_on:
      db:
        condition: service_healthy

depends_on 設定で condition: service_healthy を使用することで、DBサーバーがヘルスケアチェックをパスした後にWebサーバーが起動するようにしています。これにより、WebサーバーがDBサーバーの起動を待ってから動作を開始するため、DBサーバーがまだ起動中であるために発生する接続エラーを防ぐことができました。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?