Docker-Compose で複数のコマンドを実行する

Isaac Tony 2024年2月15日
Docker-Compose で複数のコマンドを実行する

Docker は、コンテナーと呼ばれる標準化された単位でアプリケーションをラップすることにより、依存関係を気にすることなく、開発者がアプリケーションを簡単に構築、テスト、展開できるようにします。 Docker-compose は、マルチコンテナー アプリケーションを管理するための高度な必須ツールです。

docker-compose を使用して、複数の Docker コンテナーに依存するサービスを管理するための指示を定義できます。

複数のコンテナーを管理できることに加えて、docker-compose は、アプリケーション サービスの分離された環境や、コンテナー作成時のボリューム データの保持など、他の利点も提供します。

Docker-Compose で複数のコマンドを実行する

Docker-compose は Docker エンジン上で実行され、Mac および Windows マシンに Docker と共にインストールされます。 以下のコマンドを使用すると、docker-compose がマシンに正しく設定されているかどうかを確認できます。

$ docker-compose version
Docker Compose version v2.2.3

次の例では、docker-compose を使用して Django、PostgreSQL アプリケーションをセットアップする方法を探ります。 docker-compose で複数のコマンドを実行する方法を探ります。

まず、以下に示すように、単純なエントリを含む単純な Dockerfile を作成します。 このファイルは、Docker イメージを作成するために実行されるコマンドの概要を示しています。

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /tonyloi
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /tonyloi/

Dockerfile は Python3 を基本イメージとして定義します。 ただし、プロジェクトが機能するために必要なその他の要件を記述するために、requirements.txt ファイルも定義しています。

Django>=3.0,<4.0
psycopg2>=2.8

これら 2つのファイルが配置されたので、このプロジェクトのルート ディレクトリに docker-compose.yml ファイルを作成できます。 このファイルには、構築しようとしているアプリケーションのサービス (データベースと Web サーバー) が記述されています。

これに加えて、これらのサービスで使用される Docker イメージと、マウントする可能性があるその他の Docker ボリュームも定義します。 最後に、サービスが公開するポートも指定する必要があります。

これは Django アプリケーションであるため、移行を実行して開発サーバーを起動できるようにするコマンドも指定する必要があります。 これを行うには、sh または bash を使用する方法がいくつかあります。

この場合、Unix ベースのシステムで使用できるため、sh を使用します。

docker-compose.yml:

version: "3.9"

services:
  DB:
    image: Postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: >
      sh -c "
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8080"
    volumes:

      - .:/tonyloi
    ports:
      - "8080:8080"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    depends_on:
      - DB

以下の docker-compose run コマンドを実行して、この Django プロジェクトを作成します。 このコマンドを実行する前に、ルート ディレクトリにいることを確認する必要があります。

そうでない場合は、cd コマンドを使用してルート ディレクトリに移動してください。

~/django_app$ sudo docker-compose run web Django-admin startproject new_app .

Docker-Compose run

出力:

Successfully built 00a4c8d65c91
Successfully tagged django_app_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating django_app_db_1 ... done
Creating django_app_web_run ... done

このコマンドは、docker-compose および Docker ファイルを使用して Django プロジェクトを作成します。 この例では、プロジェクトに new_app という名前を付けました。

プロジェクトに移動して、プロジェクト ファイルを一覧表示できるようになりました。

isaac@DESKTOP-HV44HT6:~/django_app$ cd new_app
isaac@DESKTOP-HV44HT6:~/django_app/new_app$ ls
__init__.py  asgi.py  settings.py  urls.py  wsgi.py
isaac@DESKTOP-HV44HT6:~/django_app/new_app$

この記事では、sh を使用して docker-compose ファイルで複数のコマンドを実行する方法を強調しました。 または、以下に示すように bash -c を使用することもできます。

command: bash -c "
   python manage.py migrate  &&
   python manage.py runserver 0.0.0.0:8080
 "

settings.py ファイルでデータベース設定を構成することにより、残りの Django アプリケーションの作成を完了することができます。

Django はデフォルトで開発中に SQLite を使用します。 したがって、PostgreSQL を使用するため、以下の必要な構成が必要です。 データベースとユーザー名を自分のものに置き換えてください。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('postgres'),
        'USER': os.environ.get('postgres'),
        'PASSWORD': os.environ.get('enter_your database'),
        'HOST': 'db',
        'PORT': 5432,
    }
}

最後に、アプリケーションを起動するために、プロジェクトのメイン ディレクトリで sudo docker-compose up コマンドを実行します。 docker-compose ファイルで指定したように、http://0.0.0.0:8080/ で開発サーバーを起動します。

~/django_app$ sudo docker-compose up

Docker-Compose Up

著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

関連記事 - Docker Compose