Elastic BeanStalk で、DjangoアプリをDockerでdeployしてみたときの話(結局失敗した)
概要
Elastic BeanStalk で、DjangoアプリをDockerでdeployしてみた。結局失敗した(^ ^;)
参考サイト
やってみたこと
- Djangoのテストアプリを作成する。
- Dockerfileを設定する。
- Dockerfile.aws.jsonを設定する
- eb init でアプリケーションを設定
- ".elasticbeanstalk/config.yml"を設定する
- eb create で環境を構築
- Nginxを設定する
バージョンなど
python3.4.3 django1.10
Djangoのテストアプリを作成する
# 適当に今回の仮想環境を作っておく $ pyenv activate EBdjangoforDocker $ pip install django # 参考サイトからテンプレートを持ってくる $ django-admin.py startproject --template=https://github.com/glynjackson/django-docker-template/zipball/master mysite
Dockerfileを設定する
参考サイトのテンプレートにはもともとDockerfileがついているので、これをminiconda+opencv付きに変更してみる。
# Dockerfile - FROM python:3.4 + continuumio/miniconda3
あと、opencvをcondaでinstallするコードを追記する。opencvに必要なパッケージも一緒にいれる。
+ RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client python-pip build-essential libpq-dev python-dev libgtk2.0-0 + RUN pip install setuptools + RUN conda install -y --channel https://conda.anaconda.org/menpo opencv3
最終的に以下のような感じになっている。
# Base python 3.4 build, inspired by https://github.com/Pakebo/eb-docker-django-simple # Python 3.4 | Django FROM python:3.4 MAINTAINER Glyn Jackson (me@glynjackson.org) ############################################################################## # Environment variables ############################################################################## # Get noninteractive frontend for Debian to avoid some problems: # debconf: unable to initialize frontend: Dialog ENV DEBIAN_FRONTEND noninteractive ############################################################################## # OS Updates and Python packages ############################################################################## RUN apt-get update \ && apt-get upgrade -y \ && apt-get install -y RUN apt-get install -y apt-utils # Libs required for geospatial libraries on Debian... RUN apt-get -y install binutils libproj-dev gdal-bin ############################################################################## # A Few pip installs not commonly in requirements.txt ############################################################################## RUN apt-get install -y nano wget # build dependencies for postgres and image bindings RUN apt-get install -y python-imaging python-psycopg2 RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client python-pip build-essential libpq-dev python-dev libgtk2.0-0 ############################################################################## # setup startup script for gunicord WSGI service ############################################################################## RUN groupadd webapps RUN useradd webapp -G webapps RUN mkdir -p /var/log/webapp/ && chown -R webapp /var/log/webapp/ && chmod -R u+rX /var/log/webapp/ RUN mkdir -p /var/run/webapp/ && chown -R webapp /var/run/webapp/ && chmod -R u+rX /var/run/webapp/ ############################################################################## # Install and configure supervisord ############################################################################## RUN apt-get install -y supervisor RUN mkdir -p /var/log/supervisor ADD ./deploy/supervisor_conf.d/webapp.conf /etc/supervisor/conf.d/webapp.conf ############################################################################## # Install dependencies and run scripts. ############################################################################## ADD . /var/projects/mysite WORKDIR /var/projects/mysite RUN pip install setuptools RUN conda install -y --channel https://conda.anaconda.org/menpo opencv3 RUN pip install -r requirements.txt ############################################################################## # Run start.sh script when the container starts. # Note: If you run migrations etc outside CMD, envs won't be available! ############################################################################## CMD ["sh", "./deploy/container_start.sh"] # Expose listen ports EXPOSE 8002
EXPOSEについては、参考サイトによると、以下のような感じらしい。
It is worth noting however that on Beanstalk's single container environments only the first port you expose (8002) is mapped to port 80 using a passthrough server on the actual EC2 instance running Docker.
Benstalkの単一コンテナ環境だと、最初のexpose(今回だと8002)だけが、port80にmappingされるみたい。実際にウェブサーバが稼働しているEC2インスタンス上のDokcerではね。だからexposeはいくつか書いてもあんま意味ないよ。のようなことを言っている気がする。。。
CMD ["sh", "./deploy/container_start.sh"]
について
sh -> shファイルを実行するコマンド
container_start.sh
cd /var/projects/mysite && python manage.py migrate --noinput supervisord -n -c /etc/supervisor/supervisord.conf
supervisordは、簡単に複数のデーモンの実行を指示できるものらしい。
Supervisordを使って複数のサービスを単一コンテナで起動する | TANKSUZUKI.COM
Dockerfile.aws.json の設定
Dockerrun.aws.json ファイルは、Docker コンテナを Elastic Beanstalk アプリケーションとしてデプロイする方法を記述するものです。この JSON ファイルは Elastic Beanstalk に固有です。
今回のサンプルだと以下のようになっている。
{ "AWSEBDockerrunVersion": "1", "Logging": "/var/eb_log" }
eb createで環境を作成する。
$ eb create
めちゃ時間がかかってerrorが出た!
TIMEOUTを900にしてみる。
再度挑戦。。。無事deployは完了!!
$ eb open
してみる。。。。internal error!ダメだぁ〜。