awsのcloud9でdocker上のcakePHPをリモートデバックしたくて、頑張ったらできた。

ほかのphpのIDEだと、リモートデバッグする時にpath mappingみたいな設定ができるけど、cloud9だとそれがなさそう。かわりに、dockerもcloud9と同じpathにしたら動いたので。そのメモ。

ファイル一覧

  • Dockerfile-php-container … DockerFile
  • docker-compose.yml … docker compose ファイル
  • My Runner … Cloud9のDebug用Runnerファイル

作業フォルダ

cloud9上で、作業するフォルダを作成

mkdir /home/ec2-user/environment/php/cake_dev/
cd /home/ec2-user/environment/php/cake_dev/

Docker準備

上で作ったフォルダに次のファイルを作って配置

Dockerfile-php-container

php7.2でcakePHPに必要なプラグインとxdebugの設定を書いたDockerFileをこんな感じで。xdebug.remote_hostは 親docker のipを指定。

FROM  php:7.2-fpm
RUN apt-get -y update \
    && apt-get install -y libicu-dev\
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl \
    && docker-php-ext-install pdo_mysql
    
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_host=172.17.0.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_mode=req" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.idekey=cloud9ide" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

docker-compose.yml

cloud9のRunnerだと、リモートDebugした時に src の pathを合わせることができなそうなので、dockerとcloud9の path を揃えてます。

今回は、このpath:/home/ec2-user/environment/php/cake_dev/ 

version: '3'

services:
  db:
    image: mysql:5.7
    container_name: mydb
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: cake_cms
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    ports:
      - "3306:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      
  web:
    build:
      context: .
      dockerfile: Dockerfile-php-container
    container_name: php_web
    depends_on:
      - db
    # for cloud9 runner (debug) -> Make the directory structure the same 
    volumes:
      - /home/ec2-user/environment/php/cake_dev/:/home/ec2-user/environment/php/cake_dev/
    ports:
      - "8888:8888"
    links:
      - db
    command: bash -c "cd /home/ec2-user/environment/php/cake_dev/cms && bin/cake server -H 0.0.0.0 -p 8888"
      
volumes:
  mysqldata:

Cloud9のRunnner

My Runner

xdebugしたいだけなので、scriptは止まらないように cat あとは、debughostにdockerのip を指定してます。

// This file overrides the built-in PHP (cli) runner
// For more information see http://docs.aws.amazon.com/console/cloud9/change-runner
{
  "script": [
    "cat "
  ],
  "selector": "^.*\\.(php|phar)$",
  "info": "Running PHP script $file",
  "working_dir": "/",
  "debugger": "xdebug",
  "debughost": "172.17.0.1",
  "debugport": 9000,
  "env": {},
  "trackId": "cloud9ide"
}

CakePHP準備

CakePHPはcloud9上のフォルダにジェネレーターで資材一式を作って、docker-composeのvolumesでdockerから見えるような構成にしてます。

作成

curl -s https://getcomposer.org/installer | php
php composer.phar create-project --prefer-dist cakephp/app cms

動作確認

docker起動

docker-compose up -d

runner起動

ボタンポチ

ブレークポイント

cms/src/Controller/PagesController.php の適当なところにブレークポイント

URLにアクセス

cloud9のurlにポート8888でアクセスして、ブレークポイントで止まればOK

※ 8888のポートはAWSの管理コンソールで空けておかないと、届かないので注意。

docker停止

docker-compose down