😀

GeoDjangoの開発環境をDockerで構築

2024/03/19に公開

環境

  • Windows11
  • WSL(Ubuntu 22.04.03 LTS)
  • Docker Desktop version 4.26.0

goal

Djangoアプリケーション用Dockerコンテナと、postGISデータベースコンテナを構築して、GeoDjango開発環境を構築する。

必要なファイル

  • docker-compose.yml
  • Dockerfile(DockerfileWeb, DockerfileDb)
  • requirement.txt → PiP用

docker-compose.yml

dokcer-compose.yml
version: "3.9"

services:
  web:
    build: 
      context: .
      dockerfile: DockerfileWeb
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    build: 
      context: .
      dockerfile: DockerfileDb
    image: postgis/postgis:16-3.4
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"

volumes:
  postgres_data:

Dockerfile

DockerfileWeb
# ベースとなるイメージのPull
FROM python:3.11.8-slim-bullseye

# 環境変数の設定
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 作業ディレクトリの設定
WORKDIR /code

# gdal for GeoDjango
RUN apt update
RUN apt install -y \
    binutils \
    gdal-bin \
    libproj-dev 
RUN rm -rf /var/lib/apt/lists/*

# 依存関係のインストール
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# プロジェクトのコピー
COPY . .
DockerfileDb
# Pull base image
FROM postgis/postgis:16-3.4

requirements.txt

requirement.txt
asgiref==3.7.2
Django==5.0.3
sqlparse==0.4.4
psycopg2-binary==2.9.9

ここまでのファイル構成

 .
 ├── DockerfileDb
 ├── DockerfileWeb
 ├── docker-compose.yml
 └── requirements.txt

Djangoプロジェクトの作成

  1. Django用のPython仮想環境を作成
    $ python -m venv .venv
    
  2. 仮想環境のアクティベイト
    $ source .venv/bin/activate
    
  3. Django 依存関係のインストール
    (.venv)$ pip install -r requirement.txt
    
  4. Django プロジェクトの作成
    (.venv)$ django-admin startproject geodjango .
    
    最後のドットを忘れずに
  5. geodjango/settings.py の編集
    • INSTALLED_APPS に 'django.contrib.gis'を追加

      geodjango/settings.py
      INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          'django.contrib.gis', # これを追加
      ]
      
    • DATABASEを下記に変更

      geodjango/settings.py
      DATABASES = {
          "default": {
              "ENGINE": "django.contrib.gis.db.backends.postgis",
              "NAME": "postgres",
              "USER": "postgres",
              "PASSWORD": "postgres",
              "HOST": "db",  # set in docker-compose.yml
              "PORT": 5432,  # default postgres port
          }
      }
      

      USER、PASSWORD、PORT は postgreSQL のデフォルト値なので、プロダクションでは変更する必要あり。今回は開発環境なのでそのまま。

    • 日本にロケール

      geodjango/settings.py
      LANGUAGE_CODE = 'ja'
      
      TIME_ZONE = 'Asia/Tokyo'
      
  6. 仮想環境から抜ける
    (.venv)$ deactivate
    

Dockerで環境構築

  1. Dockerのビルド
    $ docker compose build
    
  2. Dockerコンテナの起動
    $ docker compose up
    
    オプション-dはデタッチドモード、つまりバックエンドでの動作できるけど、今回はそのまま。
    web-1  | System check identified 1 issue (0 silenced).
    web-1  | March 18, 2024 - 17:09:58
    web-1  | Django version 5.0.3, using settings 'geoproject.settings'
    web-1  | Starting development server at http://0.0.0.0:8000/
    web-1  | Quit the server with CONTROL-C.
    
    のような表示になるはず。
  3. http://127.0.0.1:8000にブラウザでアクセス
    ロケットが表示されたらOK
  4. コンテナの終了を忘れずに
    $ docker compose down
    

参考にしたもの

Discussion