takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Google Apps Script では XMLHttpRequest が使えない

Google Apps Script から他サイトに対して HTTP GET リクエストするため XMLHttpRequest を使おうとしたら、下記エラーが発生しました。

ReferenceError: "XMLHttpRequest" is not defined.

Google Apps Script では代わりに UrlFetchApp.fetch を使うようです。
以下のようなコードで無事 GET リクエストが実行できました。

function httpGet(theUrl) {
  var resp = UrlFetchApp.fetch(theUrl);
  var data = JSON.parse(resp.getContentText());
  return data;
}

Docker Hub の MySQL 5.6 公式イメージの設定を変更する

Docker Hub の MySQL 5.6 公式イメージの設定変更したときのメモ。
変更項目

  • timezone を Japan に変更
  • sql_mode の STRICT_TRANS_TABLES を無効化

デフォルトの my.cnf の内容

公式イメージをそのまま起動したときの /etc/mysql/my.cnf

#
# The MySQL Community Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[client]
port		= 3306
socket		= /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
nice		= 0

[mysqld]
user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
lc-messages-dir	= /usr/share/mysql
explicit_defaults_for_timestamp

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address	= 127.0.0.1

#log-error	= /var/log/mysql/error.log

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

timezone の変更

my.cnf を見ると timezone を指定している部分はありません。
その場合、OS の timezone と同じになるので、今回は Dockerfile で OS 側の timezone を Japan に変更することにします。

sql_mode の変更

my.cnf の最後で /etc/mysql/conf.d/ にある cnf ファイルをインクルードするようになっているので、試しに以下のような cnf ファイルを追加してみましたが STRICT_TRANS_TABLES は有効のままでした。

/etc/mysql/conf.d/ext_my.cnf

[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

my.cnf の sql_mode の項目を直接書き換えることで対応しました。

mysql の Dockerfile

以下が変更項目に対応した Dockerfile になります。

FROM mysql:5.6
MAINTAINER takaya030

# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime

# modify my.cnf
RUN sed -i -e "s/^sql_mode=.*$/sql_mode=NO_ENGINE_SUBSTITUTION/" /etc/mysql/my.cnf

Docker コンテナに ssh でログインする

下記の記事で作成した Apache + PHP 環境のコンテナに ssh ログインしたいケースが出てきたので sshd も起動するように変更したときの手順メモ

Dockerfile の変更

Docker は 1 コンテナ 1 プロセスが推奨されていますが、今回のように複数プロセス起動させる場合、supervisord を使うのがいろいろと便利

laravel/webapp/Dockerfile
前回の内容から supervisordsshd のインストールと初期設定が追加されている

#
# Apache + PHP
#
# 20160622
#   CentOS 6.6 + epel,remi,rpmforge
#   Apache 2.2.15
#   PHP 5.5.25

FROM centos:6
MAINTAINER takaya030

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

# epel repo
RUN yum install -y http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && \
    yum clean all
RUN sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/epel.repo

# remi repo
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && \
    yum clean all
RUN sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/remi.repo

# rpmforge repo
RUN yum install -y http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm && \
    yum clean all
RUN sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/rpmforge.repo

# mysql community repo
RUN yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm && \
    yum clean all
RUN sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/mysql-community.repo

# httpd, sshd, scp, sudo, which
RUN yum install -y httpd httpd-tools openssh-server openssh-clients sudo which && \
    yum clean all

# mysql-community-client
RUN yum install --enablerepo=mysql56-community -y mysql-community-client && \
    yum clean all

# libmcrypt, s3cmd, supervisor
RUN yum install --enablerepo=epel -y libmcrypt s3cmd supervisor && \
    yum clean all

# gd-last (for php-gd)
RUN yum install --enablerepo=remi -y gd-last && \
    yum clean all

# php-pecl-memcached
RUN yum install --enablerepo=remi,remi-php55 -y php-pecl-memcached && \
    yum clean all

# php
RUN yum install --enablerepo=remi-php55 -y php php-devel php-gd php-mbstring php-mcrypt php-mysqlnd php-pear php-xml php-opcache && \
    yum clean all

# modify /etc/php.ini
RUN sed -i -e "s/;date.timezone *=.*$/date.timezone = Asia\/Tokyo/" /etc/php.ini

# composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# phpunit
RUN curl -L https://phar.phpunit.de/phpunit.phar > /usr/local/bin/phpunit && \
	chmod +x /usr/local/bin/phpunit

# initialize for ssh
RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd
RUN /sbin/service sshd start
RUN /sbin/service sshd stop

# create login user
RUN useradd -d /home/laravel -m -s /bin/bash laravel
RUN echo laravel:password | chpasswd
RUN echo 'laravel ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime

ENV WEBAPP_ROOT /webapp

ADD ./httpd.conf /etc/httpd/conf/httpd.conf
ADD ./index.html /webapp/public/index.html
ADD ./phpinfo.php /webapp/public/phpinfo.php
ADD ./supervisord.conf /etc/supervisord.conf

EXPOSE 22 80

CMD ["/usr/bin/supervisord"]

supervisord.conf の追加

laravel/webapp/supervisord.conf
必ず "nodaeman=true" とすること

[supervisord]
http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server)
;http_port=127.0.0.1:9001  ; (alternately, ip_address:port specifies AF_INET)
;sockchmod=0700              ; AF_UNIX socketmode (AF_INET ignore, default 0700)
;sockchown=nobody.nogroup     ; AF_UNIX socket uid.gid owner (AF_INET ignores)
;umask=022                   ; (process file creation umask;default 022)
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (logging level;default info; others: debug,warn)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true               ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;http_username=user          ; (default is no username (open system))
;http_password=123           ; (default is no password (open system))
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;user=chrism                 ; (default is current user, required if root)
;directory=/tmp              ; (default is not to cd during start)
;environment=KEY=value       ; (key value pairs to add to environment)

[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as http_username if set
;password=123                ; should be same as http_password if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")

; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

[program:sshd]
command=/usr/sbin/sshd -D

[program:httpd]
command=/usr/sbin/httpd -DFOREGROUND

docker-compose.yml の変更

larvel/docker-compose.yml
コンテナのポート 22 をホストのポート 2022 にフォワードさせる設定追加

webapp: 
  build: ./webapp
  hostname: webapp
  ports: 
    - "80:80"
    - "2022:22"
  volumes: 
    - /workspace/laravel:/webapp
  links: 
    - mysql
    - memcached

mysql: 
 image: mysql:5.6
 environment: 
    - MYSQL_ROOT_PASSWORD=password
 ports: 
    - "3306:3306"
 volumes: 
    - /mnt/sda1/var/lib/mysql:/var/lib/mysql

memcached:
 image: memcached

コンテナの起動

古いコンテナを削除してから起動する

docker@dev:~$ docker rm `docker ps -a -q`
docker@dev:~$ cd /home/docker/laravel
docker@dev:~/laravel$ docker-compose up -d

動作確認

C:\>ssh laravel@192.168.99.100 -p 2022
laravel@192.168.99.100's password:
Last login: Sun Sep  6 10:19:51 2015 from 192.168.99.1
[laravel@webapp ~]$ php --version
PHP 5.5.29 (cli) (built: Sep  3 2015 11:00:33)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

Windows 上に構築した Docker 環境で Laravel を動かす

Windows の Docker 環境(boot2docker)で Laravel を動かすまでの作業手順メモ

Laravel のインストール

下記の手順で Windows 上で Laravel をインストールします。
Windows で composer を使う方法についてはこちらの記事を参照してください。

c:\>cd workspace
c:\workspace>mkdir laravel
c:\workspace>cd laravel
c:\workspace\laravel>composer create-project "laravel/laravel" --prefer-dist .

docker-compose.yml の作成

Docker ホストマシン (CoreOS) に /home/docker/laravel ディレクトリを作り、そこに下記の内容でファイルを配置します。

laravel
│  docker-compose.yml
│  
└─webapp
        Dockerfile
        httpd.conf
        index.html
        phpinfo.php

docker-composer.yml

webapp: 
  build: ./webapp
  hostname: webapp
  command: /usr/sbin/httpd -DFOREGROUND
  ports: 
    - "80:80"
  volumes: 
    - /workspace/laravel:/webapp
  links: 
    - mysql
    - memcached

mysql: 
 image: mysql:5.6
 environment: 
    - MYSQL_ROOT_PASSWORD=password
 ports: 
    - "3306:3306"
 volumes: 
    - /mnt/sda1/var/lib/mysql:/var/lib/mysql

memcached:
 image: memcached

webapp 以下はこちらの記事と同じ内容になります。

コンテナの起動

docker@dev:~$ cd /home/docker/laravel
docker@dev:~/laravel$ docker-compose up -d

動作確認

web ブラウザで http://192.168.99.100/ にアクセスして下の画像のように表示されるか確認。

コンテナの停止

docker@dev:~$ cd /home/docker/laravel
docker@dev:~/laravel$ docker-compose stop

Windows版boot2docker のホスト OS (CoreOS) に Windows のフォルダをマウントする

Windows 上に "docker-machine create" で作成した docker ホストマシン (CoreOS) に Windows のフォルダをマウントさせる手順のメモ

VirtualBox 共有フォルダ設定

Windowsコマンドプロンプトで下記のコマンドを実行

C:\> VBoxManage sharedfolder add "dev" -name "workspace" -hostpath "C:\workspace"

フォルダのマウント

docker ホストマシン上で下記コマンドを実行

docker@dev:~$ sudo mkdir /workspace
docker@dev:~$ sudo mount -t vboxsf -o uid=1000,gid=50 workspace /workspace

bootlocal.sh の変更

起動時に自動でマウントさせたい場合は /var/lib/boot2docker/bootlocal.sh に下記スクリプトを追加する

sudo mkdir /workspace;sudo mount -t vboxsf -o uid=1000,gid=50 workspace /workspace

docker-machine で Windows 上に構築した docker 環境で docker-compose を使う

dduportal/fig (コンテナ版fig) のサポートが終了したので docker-compose を docker ホストにインストールしたときの手順メモ

dokcer-compose のダウンロード

docker ホスト (CoreOS) で下記コマンドを実行

docker@dev:~$ sudo curl -L -o /var/lib/boot2docker/docker-compose https://github.com/docker/compose/releases/download/1.4.0/docker-compose-Linux-x86_64
docker@dev:~$ sudo chmod +x /var/lib/boot2docker/docker-compose

bootlocal.sh の変更

/var/lib/boot2docker/bootlocal.sh に下記スクリプトを追加

if [ -x /var/lib/boot2docker/docker-compose -a ! -e /usr/local/bin/docker-compose ]; then
  ln -s /var/lib/boot2docker/docker-compose /usr/local/bin/docker-compose
fi

docker ホストをリブートするか、下記コマンドを入力することで使用可能になる

docker@dev:~$ sudo ln -s /var/lib/boot2docker/docker-compose /usr/local/bin/docker-compose

動作確認

docker@dev:~$ docker-compose -v
docker-compose version: 1.4.0

MinGWのターミナルからは ssh 経由で実行します

$ docker-machine ssh dev "docker-compose -v"
docker-compose version: 1.4.0 

最近参考にした Laravel 関連のリンク

開発業務で Laravel を使っていますが、問題が発生したときに参考にさせてもらったサイトのリンク集です
Larvel のバージョンは 4.2.16 です

データベース

キャッシュ

ログ

リクエストと入力

OAuth