はじめに
今まで GAE は Twitter Bot をいくつか動かす程度にしか使っていませんでしたが、こちらの記事を読んで感化され、本格的に使うために開発環境を構築してみました。
cloud-ja.googleblog.com
以前にも Docker で GAE for PHP の環境は作ったことはありましたが、改めて見るとイケてなかったので良い機会なので作り直しました。
takaya030.hatenablog.com
ポイントは以下の二点です。
検証環境
Windows10 Home Edition VirtualBox 5.1.22 Docker version 17.05.0-ce, build 89658be docker-compose version 1.6.2, build 4d72027
ディレクトリ構成
+---gae | | docker-compose.yml | | | +---composer | | Dockerfile | | | +---config | | | +---data | | Dockerfile | | | +---phpcli | | Dockerfile | | | +---sdk | Dockerfile | +---logs | +---www
各種設定ファイル
gae/docker-compose.yml
version: "2" services: data: build: ./data volumes: - ../:/data composer: build: ./composer volumes_from: - data phpcli: build: ./phpcli volumes_from: - data sdk: build: ./sdk volumes: - ./config/:/home/docker/.config volumes_from: - data ports: - "8080:8080" - "8000:8000"
gae/composer/Dockerfile
FROM php:5.5.34 LABEL maintainer "takaya030" WORKDIR /tmp RUN apt-get update -y && \ apt-get install -y git unzip sudo && \ apt-get clean # create docker user RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker # install composer RUN curl -sS https://getcomposer.org/installer | php && \ mv composer.phar /usr/local/bin/composer && \ composer self-update ENV COMPOSER_HOME /home/docker/.composer RUN sudo -u docker composer global require hirak/prestissimo RUN mkdir -p /data/www VOLUME ["/data"] WORKDIR /data/www USER 1000 ENTRYPOINT ["composer"] CMD ["--help"]
gae/data/Dockerfile
FROM busybox LABEL maintainer "takaya030" RUN mkdir -p /data VOLUME ["/data"] CMD ["true"]
gae/phpcli/Dockerfile
主に artisan コマンドを実行するためのイメージです
FROM php:5.5.34 LABEL maintainer "takaya030" RUN apt-get update && \ apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev && \ docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt && \ apt-get clean RUN mkdir -p /data/www VOLUME ["/data"] WORKDIR /data/www ENTRYPOINT ["php"] CMD ["--version"]
gae/sdk/Dockerfile
FROM google/cloud-sdk:alpine LABEL maintainer "takaya030" # build PHP 5.5.34 RUN apk add --update --no-cache --virtual .persistent-deps \ ca-certificates \ curl \ tar \ libpng \ libxml2 \ sudo \ xz RUN apk add --no-cache --virtual .build-deps \ autoconf \ dpkg-dev dpkg \ file \ g++ \ gcc \ libc-dev \ make \ pcre-dev \ pkgconf \ re2c \ coreutils \ curl-dev \ libedit-dev \ libxml2-dev \ libpng-dev \ sqlite-dev \ libressl \ libressl-dev \ zlib-dev \ && curl -Lso php-5.5.34.tar.gz http://jp2.php.net/get/php-5.5.34.tar.gz/from/this/mirror && \ tar xvzf php-5.5.34.tar.gz && \ cd php-5.5.34 && \ ./configure --prefix=/usr/local/php-5.5.34/ \ --enable-bcmath \ --enable-calendar \ --enable-ftp \ --enable-mbstring \ --enable-opcache \ --enable-phar \ --enable-soap \ --enable-sockets \ --enable-zip \ --disable-fileinfo \ --disable-flatfile \ --disable-posix \ --with-curl \ --with-gd \ --with-openssl \ --without-sqlite3 \ --without-pdo-sqlite \ --without-imap \ --without-kerberos \ --without-imap-ssl \ --without-interbase \ --without-ldap \ --without-mssql \ --without-oci8 \ --without-pgsql \ --without-pear \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-mysql=mysqlnd \ --with-config-file-path=/etc && \ make && make install && \ cp ./php.ini-production /etc/php.ini && \ cd .. && \ rm -r php-5.5.34 php-5.5.34.tar.gz \ && apk del .build-deps # modify /etc/php.ini RUN sed -i -e "s/;date.timezone *=.*$/date.timezone = Asia\/Tokyo/" /etc/php.ini # symbolic links RUN ln -s /usr/local/php-5.5.34/bin/php /usr/local/bin/php && \ ln -s /usr/local/php-5.5.34/bin/php-cgi /usr/local/bin/php-cgi && \ ln -s /usr/local/php-5.5.34/bin/php-config /usr/local/bin/php-config && \ ln -s /usr/local/php-5.5.34/bin/phpize /usr/local/bin/phpize # install GAE for PHP SDK RUN gcloud components install app-engine-php # create docker user RUN adduser -S -u 1000 -g 50 docker \ && echo 'docker:tcuser' | chpasswd # for saving gcloud config RUN sudo -u docker gcloud config set core/disable_usage_reporting true && \ sudo -u docker gcloud config set component_manager/disable_update_check true && \ sudo -u docker gcloud config set metrics/environment github_docker_image RUN mkdir -p /data/www VOLUME ["/data","/home/docker/.config"] WORKDIR /data/www USER 1000 CMD ["dev_appserver.py","--php_executable_path=/usr/local/bin/php-cgi","--host","0.0.0.0","--admin_host","0.0.0.0","./"]
Lumen のインストール
イメージビルド後、以下のコマンドで Lumen をインストールします。(www フォルダにインストールされます)
後述する GaeSupportLumen を使用する場合 Lumen 5.1 が必要なため下記の通り "v5.1.4" を指定します。
$ docker-compose run --rm composer create-project laravel/lumen . v5.1.4
GaeSupportLumen のインストール
Lumen インストール後、以下のコマンドで GaeSupportLumen をインストールします。
$ docker-compose run --rm composer require shpasser/gae-support-lumen:~1.0 $ docker-compose run --rm composer require illuminate/mail:~5.0
bootstrap/app.php を下記の通りに変更します。
--- bootstrap\app.php.orig Mon Aug 03 21:56:04 2015 +++ bootstrap\app.php Sat Jun 24 10:43:33 2017 @@ -19,7 +19,7 @@ realpath(__DIR__.'/../') ); -// $app->withFacades(); +$app->withFacades(); // $app->withEloquent(); @@ -80,6 +80,7 @@ // $app->register(App\Providers\AppServiceProvider::class); // $app->register(App\Providers\EventServiceProvider::class); +$app->register(Shpasser\GaeSupportLumen\GaeSupportServiceProvider::class); /* |--------------------------------------------------------------------------
以下のコマンドで GAE の各種設定を行います。
$ docker-compose run --rm phpcli artisan gae:setup --config my-gae-project
gcloud の初期設定
以下のコマンドで gcloud の初期設定を行います。この操作は一回実行するだけで OK です
$ docker-compose run --rm sdk gcloud config set core/disable_usage_reporting true $ docker-compose run --rm sdk gcloud config set component_manager/disable_update_check tru e $ docker-compose run --rm sdk gcloud config set metrics/environment github_docker_image
gcloud info で設定内容が確認できます
$ docker-compose run --rm sdk gcloud info Starting gae_data_1 Google Cloud SDK [162.0.0] Platform: [Linux, x86_64] ('Linux', 'f857ebb6463e', '4.4.66-boot2docker', '#1 SMP Fri May 5 20:44:25 UTC 2017', 'x86_64', '') Python Version: [2.7.13 (default, Dec 22 2016, 09:22:15) [GCC 6.2.1 20160822]] Python Location: [/usr/bin/python2] Site Packages: [Disabled] Installation Root: [/google-cloud-sdk] Installed Components: gsutil: [4.27] core: [2017.07.07] app-engine-python: [1.9.57] gcloud: [] bq: [2.0.24] System PATH: [/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin] Python PATH: [/google-cloud-sdk/lib/third_party:/google-cloud-sdk/lib:/usr/lib/python27.zip:/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload] Cloud SDK on PATH: [True] Kubectl on PATH: [False] Installation Properties: [/google-cloud-sdk/properties] User Config Directory: [/home/docker/.config/gcloud] Active Configuration Name: [default] Active Configuration Path: [/home/docker/.config/gcloud/configurations/config_default] Account: [None] Project: [None] Current Properties: [metrics] environment: [github_docker_image] [core] disable_usage_reporting: [true] [component_manager] disable_update_check: [true] Logs Directory: [/home/docker/.config/gcloud/logs] Last Log File: [/home/docker/.config/gcloud/logs/2017.07.19/13.19.29.094936.log] git: [git version 2.11.2] ssh: [OpenSSH_7.4p1, LibreSSL 2.4.4]
動作確認
以下のコマンドで開発用サーバーが起動します。
$ docker-compose up -d
web ブラウザで http://192.168.99.100:8080 にアクセスして以下の画面が表示されれば成功です。
http://192.168.99.100:8000 にアクセスすると管理ページが表示されます。
参考サイト
- LumenをGoogleAppEngineで動かしたメモ - Qiita
- GitHub - shpasser/GaeSupportLumen: Google App Engine Support package for Lumen
- google/cloud-sdk - Docker Hub
- How to set up Google App Engine PHP SDK on Ubuntu - Stack Overflow
- php/Dockerfile at c48c629568bc166b58b271114d0b44ea6d5cfa09 · docker-library/php · GitHub
- Unsatisfiable constraints when installing postgresql-dev on ruby:2.4-alpine · Issue #110 · docker-library/ruby · GitHub
- ruby:2.1-alpine update (to alpine 3.5) broke postgresql compatibility, openssl/libressl dependency conflicts · Issue #104 · docker-library/ruby · GitHub
- Revert many of the Alpine 3.5 upgrades by tianon · Pull Request #2513 · docker-library/official-images · GitHub
更新履歴
- (2017/07/19) gclod config のフォルダを volume 指定するように変更。gcloud の初期設定を追加
- (2017/06/27) composer の hirak/prestissimo プラグインが機能していなかったのを修正