dockerfileでdjangoの環境を構築する
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=
ディスカッション
コメント一覧
まだ、コメントがありません