dockerfileでdjangoの環境を構築する

2020年12月21日

dockerfileでdjangoの環境を構築する

djangoの環境を作るにあたってapacheやdjangoの設定ファイルの書き換えが大変だったのでdockerfileにしてみました。詳細は以前の記事の通りです。

参考記事:
  ・dockerfileでSSHの設定も自動化する
  ・djangoをApache+MariaDBで環境構築する
  ・django-environを使ってみる
  ・djangoのsettings.pyをsedで書き換えたい
  ・条件にマッチした行を抜き出して外部ファイルに書き込む

イメージ作成

dockerfileは下記の通りです。
ビルドしたらdocker-composeなどでコンテナを作成します。


FROM centos:7
MAINTAINER Houdoukyokucho

# yum update & clean
RUN yum -y update && yum clean all

# configure ssh
RUN yum -y install openssh-server openssh-clients
RUN sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
RUN echo 'root:rootpassword' |chpasswd

# create user
RUN useradd -m djangouser
RUN mkdir /home/djangouser/.ssh
RUN chown djangouser:djangouser /home/djangouser/.ssh
RUN chmod 700 /home/djangouser/.ssh
COPY authorized_keys /home/djangouser/.ssh/authorized_keys
RUN chown djangouser:djangouser /home/djangouser/.ssh/authorized_keys
RUN chmod 600 /home/djangouser/.ssh/authorized_keys
RUN mkdir /home/djangouser/local
RUN chown djangouser:djangouser /home/djangouser/local

# install python and pip
RUN yum install -y https://repo.ius.io/ius-release-el7.rpm
RUN yum install -y python36u python36u-devel python36u-libs
RUN yum install -y python36u-pip
RUN pip3.6 install --upgrade pip

# configure mariadb
RUN yum install -y  mariadb mariadb-server mariadb-devel
RUN sed -i -e 's/\[mysqld\]/\[mysqld\]\ncharacter-set-server = utf8\nsql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES/g' /etc/my.cnf
RUN sed -i -e 's/pid-file=\/var\/run\/mariadb\/mariadb.pid/pid-file=\/var\/run\/mariadb\/mariadb.pid\n\n\[client\]\ndefault-character-set = utf8/g' /etc/my.cnf

# install httpd
RUN yum install -y httpd-devel

# install mysqlclient
RUN yum install -y gcc
RUN pip3 install mysqlclient

# configure wsgi
RUN pip3 install mod_wsgi
RUN cp /usr/local/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so /etc/httpd/modules/
RUN touch /etc/httpd/conf.d/django.conf
RUN echo "LoadModule wsgi_module modules/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so" >> /etc/httpd/conf.d/django.conf
RUN echo "WSGIScriptAlias / /home/web/django_project/config/wsgi.py" >> /etc/httpd/conf.d/django.conf
RUN echo "WSGIPythonPath /home/web/django_project" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf
RUN echo "Require all granted" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf
RUN echo "###Alias###" >> /etc/httpd/conf.d/django.conf
RUN echo "Alias /static /home/web/django_project/static/" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf
RUN echo "Require all granted" >> /etc/httpd/conf.d/django.conf
RUN echo "" >> /etc/httpd/conf.d/django.conf

# create django_project
RUN pip3 install django
RUN mkdir /home/web/
RUN mkdir /home/web/django_project
RUN django-admin startproject config /home/web/django_project/
RUN mkdir /home/web/django_project/templates
RUN mkdir /home/web/django_project/static

# make django-environ
RUN pip3 install django-environ
RUN touch /home/web/.env
RUN grep -e '^SECRET_KEY' /home/web/django_project/config/settings.py | sed -e "s/ //g" >> /home/web/.env
RUN echo "" >> /home/web/.env
RUN echo "DEBUG=True" >> /home/web/.env
RUN echo "" >> /home/web/.env
RUN echo "ALLOWED_HOSTS=*" >> /home/web/.env
RUN echo "" >> /home/web/.env
RUN echo "DB_ENGINE=django.db.backends.mysql" >> /home/web/.env
RUN echo "DB_NAME=" >> /home/web/.env
RUN echo "DB_USER=" >> /home/web/.env
RUN echo "DB_PASSWD=" >> /home/web/.env
RUN echo "DB_HOST=" >> /home/web/.env
RUN echo "DB_PORT=" >> /home/web/.env
RUN echo "" >> /home/web/.env
RUN echo "DEFAULT_FROM_EMAIL=" >> /home/web/.env
RUN echo "EMAIL_HOST=" >> /home/web/.env
RUN echo "EMAIL_PORT=" >> /home/web/.env
RUN echo "EMAIL_HOST_USER=" >> /home/web/.env
RUN echo "EMAIL_HOST_PASSWORD=" >> /home/web/.env
RUN echo "EMAIL_USE_TLS=" >> /home/web/.env

# modify settings.py
RUN sed -i -e "13i #--environ-------------------------------------------------\nimport environ\n\nenv = environ.Env()\nenv.read_env('\/home\/web\/.env')\n\n#--default-------------------------------------------------" /home/web/django_project/config/settings.py
RUN sed -i -e "s/^SECRET_KEY.*/SECRET_KEY = env('SECRET_KEY')/g" /home/web/django_project/config/settings.py
RUN sed -i -e "s/'django.db.backends.sqlite3'/env('DB_ENGINE')/g" -e "s/BASE_DIR \/ 'db.sqlite3',/env('DB_NAME'),\n\t\t'USER': env('DB_USER'),\n\t\t'PASSWORD': env('DB_PASSWD'),\n\t\t'HOST': env('DB_HOST'),\n\t\t'PORT': env('DB_PORT'),/g" /home/web/django_project/config/settings.py
RUN sed -i -e "s/DEBUG = True/DEBUG = env.bool('DEBUG')/g" /home/web/django_project/config/settings.py
RUN sed -i -e "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \[env('ALLOWED_HOSTS')\]/g" /home/web/django_project/config/settings.py
RUN sed -i -e "s/LANGUAGE_CODE = 'en-us'/LANGUAGE_CODE = 'ja'/g" -e "s/TIME_ZONE = 'UTC'/TIME_ZONE = 'Asia\/Tokyo'/g" /home/web/django_project/config/settings.py

# woner change
RUN chown djangouser:djangouser -R /home/web

# enable daemon
RUN systemctl enable httpd
RUN systemctl enable mariadb

CMD /sbin/init

EXPOSE 80
EXPOSE 443
EXPOSE 22

データベースの設定

mariadbの初期設定をします。


mysql_secure_installation
Enter current password for root (enter for none):   # <----- 起動したてでrootパスワードが設定されていないので、そのまま「Enter」。
Set root password? [Y/n] Y                          # <----- Rootパスワードを設定するので「Y」。
New password:                                       # <----- パスワードを設定
Re-enter new password:                              # <----- パスワードを再入力
Remove anonymous users? [Y/n] Y                     # <----- 誰でもログインできる状態になっているのでそれをRemoveするので「Y」。
Disallow root login remotely? [Y/n] Y               # <----- RootでMySQLにリモートログインできるのはセキュリティ的にNGなので「Y」。
Remove test database and access to it? [Y/n] Y      # <----- testデータベースは不要のため「Y」。
Reload privilege tables now? [Y/n] Y                # <----- 上記設定による権限の変更等を即時反映したいので「Y」。

mysql -u root -p
Enter password:                                     # <----- 先ほど設定したパスワードを入力。
MariaDB [(none)]> create database djangodatabase;   # <----- 作成したいデータベース名を入力。
MariaDB [(none)]> exit;

データベースの設定を読み込む

settings.pyに書き込む値は「.env」で管理します。
「.env」はdockerfileで作成済みですので下記の3か所のみ値を入れてデータベースを読み込めるようにしましょう。


cat .env 
SECRET_KEY='%o9%zon-dhvq-m#m32x6#h5nt=*=4l+z*)fx$_rb@)yi#@-33n'

DEBUG=True

ALLOWED_HOSTS=*

DB_ENGINE=django.db.backends.mysql
DB_NAME=djangodatabase # <----- データベース名を設定
DB_USER=root           # <----- ユーザー名を設定
DB_PASSWD=something    # <----- パスワードを設定
DB_HOST=
DB_PORT=

DEFAULT_FROM_EMAIL=
EMAIL_HOST=
EMAIL_PORT=
EMAIL_HOST_USER=
EMAIL_HOST_PASSWORD=
EMAIL_USE_TLS=
YouTube

2020年12月21日