Docker-composeでWordPress開発環境を作る+自動化

※SSH接続をパスワードで行う方法を追記(2021/04/15)
※phpMyAdminの導入を追記(2021/04/16)
※debianバージョンアップ時の対応を追記(2021/12/06)

以前はVCCWでサイト構築していたが、

  • 起動に時間がかかる
  • メモリを食う
  • 容量を食う

など不便を感じたため、Dockerを使うようになった。

下記で作られた開発環境がとてつもなく便利。

Docker-composeで最強(自分史上)のWordPress開発環境を作る

Qiita

毎度、自動化など自分用に手を加えてるとこのメモ。

.envファイルにテスト環境追加

.envファイルのwordmoveコンテナの設定にあるPRODUCTION_から始まる箇所を丸ごとコピーしSTAGING_に置換し値を設定する。

# -------------------------------------------
# wordpress・mysqlコンテナの設定
# -------------------------------------------
# プロダクトの名前 作成されるcontainer名の接頭語として使用
PRODUCTION_NAME=
# local wordpressを紐付けるPort名(ex: 8080)
LOCAL_SERVER_PORT=
# localのmysqlを紐付けるPort名(ex: 3306)
LOCAL_DB_PORT=

# -------------------------------------------
# wordmoveコンテナの設定
# -------------------------------------------
# 全て本番環境の情報
# URL
PRODUCTION_URL=
# wordpressのディレクトリの絶対パス
PRODUCTION_DIR_PATH=
# DB名
PRODUCTION_DB_NAME=
# DBのユーザー名
PRODUCTION_DB_USER=
# DBのパスワード
PRODUCTION_DB_PASSWORD=
# DBのホスト名
PRODUCTION_DB_HOST=
# DBの接続ポート
PRODUCTION_DB_PORT=
# SSHホスト名
PRODUCTION_SSH_HOST=
# SSHユーザー名
PRODUCTION_SSH_USER=
# SSHポート名
PRODUCTION_SSH_PORT=
# SSHパスワード(パスアクセスの場合)
PRODUCTION_SSH_PASS=

# テスト環境の情報
# URL
STAGING_URL=
# wordpressのディレクトリの絶対パス
STAGING_DIR_PATH=
# DB名
STAGING_DB_NAME=
# DBのユーザー名
STAGING_DB_USER=
# DBのパスワード
STAGING_DB_PASSWORD=
# DBのホスト名
STAGING_DB_HOST=
# DBの接続ポート
STAGING_DB_PORT=
# SSHホスト名
STAGING_SSH_HOST=
# SSHユーザー名
STAGING_SSH_USER=
# SSHポート名
STAGING_SSH_PORT=
# SSHパスワード(パスアクセスの場合)
STAGING_SSH_PASS=

※36, 60行目はSSH接続でパスワードを使う場合

config/movefile.ymlにテスト環境追加

global:
  sql_adapter: default

local:
  vhost: "http://localhost:<%= ENV['LOCAL_SERVER_PORT'] %>"
  wordpress_path: "/var/www/html/"
  database:
    name: "wordpress"
    user: "root"
    password: "wordpress"
    host: "database"

production:
  vhost: "<%= ENV['PRODUCTION_URL'] %>"
  wordpress_path: "<%= ENV['PRODUCTION_DIR_PATH'] %>"

  database:
    name: "<%= ENV['PRODUCTION_DB_NAME'] %>"
    user: "<%= ENV['PRODUCTION_DB_USER'] %>"
    password: "<%= ENV['PRODUCTION_DB_PASSWORD'] %>"
    host: "<%= ENV['PRODUCTION_DB_HOST'] %>"
    port: "<%= ENV['PRODUCTION_DB_PORT'] %>"

  exclude:
    - '.git/'
    - '.gitignore'
    - '.gitmodules'
    - '.env'
    - 'node_modules/'
    - 'bin/'
    - 'tmp/*'
    - 'Gemfile*'
    - 'Movefile'
    - 'movefile'
    - 'movefile.yml'
    - 'movefile.yaml'
    - 'wp-config.php'
    - 'wp-content/*.sql.gz'
    - '*.orig'
    - "wp-content/uploads/backwpup*/*"
    - ".htaccess"

  ssh:
    host: "<%= ENV['PRODUCTION_SSH_HOST'] %>"
    user: "<%= ENV['PRODUCTION_SSH_USER'] %>"
    port: "<%= ENV['PRODUCTION_SSH_PORT'] %>"
    password: "<%= ENV['PRODUCTION_SSH_PASS'] %>" # パス接続の場合
    rsync_options: "--verbose"

staging:
  vhost: "<%= ENV['STAGING_URL'] %>" 
  wordpress_path: "<%= ENV['STAGING_DIR_PATH'] %>" 

  database:
    name: "<%= ENV['STAGING_DB_NAME'] %>" 
    user: "<%= ENV['STAGING_DB_USER'] %>" 
    password: "<%= ENV['STAGING_DB_PASSWORD'] %>" 
    host: "<%= ENV['STAGING_DB_HOST'] %>" 
    port: "<%= ENV['STAGING_DB_PORT'] %>" 

  exclude:
    - '.git/'
    - '.gitignore'
    - '.gitmodules'
    - '.env'
    - 'node_modules/'
    - 'bin/'
    - 'tmp/*'
    - 'Gemfile*'
    - 'Movefile'
    - 'movefile'
    - 'movefile.yml'
    - 'movefile.yaml'
    - 'wp-config.php'
    - 'wp-content/*.sql.gz'
    - '*.orig'
    - "wp-content/uploads/backwpup*/*"
    - ".htaccess"

  ssh:
    host: "<%= ENV['STAGING_SSH_HOST'] %>"
    user: "<%= ENV['STAGING_SSH_USER'] %>"
    port: "<%= ENV['STAGING_SSH_PORT'] %>"
    password: "<%= ENV['STAGING_SSH_PASS'] %>" # パス接続の場合
    rsync_options: "--verbose"

※47, 84行目はSSH接続でパスワードを使う場合

docker-compose.xml にテスト環境追加

version: '3'
services:
    database:
        image: mysql:5.7
        command:
            - "--character-set-server=utf8"
            - "--collation-server=utf8_unicode_ci"
        ports:
            - "${LOCAL_DB_PORT}:3306"
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_db"
        environment:
            MYSQL_USER: wordpress
            MYSQL_DATABASE: wordpress
            MYSQL_PASSWORD: wordpress
            MYSQL_ROOT_PASSWORD: wordpress
    wordpress:
        depends_on:
            - database
        image: wordpress:latest
        container_name: "${PRODUCTION_NAME}_wordpress"
        ports:
            - "${LOCAL_SERVER_PORT}:80"
        restart: on-failure:5
        volumes:
            - ./public:/var/www/html
        environment:
            WORDPRESS_DB_HOST: database:3306
            WORDPRESS_DB_PASSWORD: wordpress
    wordmove:
        tty: true
        depends_on:
            - wordpress
        image: welaika/wordmove
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_wordmove"
        volumes:
            - ./config:/home/
            - ./public:/var/www/html
            - ~/.ssh:/home/.ssh
        environment:
            LOCAL_SERVER_PORT: "${LOCAL_SERVER_PORT}"
            PRODUCTION_URL: "${PRODUCTION_URL}"
            PRODUCTION_DIR_PATH: "${PRODUCTION_DIR_PATH}"
            PRODUCTION_DB_NAME: "${PRODUCTION_DB_NAME}"
            PRODUCTION_DB_USER: "${PRODUCTION_DB_USER}"
            PRODUCTION_DB_PASSWORD: "${PRODUCTION_DB_PASSWORD}"
            PRODUCTION_DB_HOST: "${PRODUCTION_DB_HOST}"
            PRODUCTION_DB_PORT: "${PRODUCTION_DB_PORT}"
            PRODUCTION_SSH_HOST: "${PRODUCTION_SSH_HOST}"
            PRODUCTION_SSH_USER: "${PRODUCTION_SSH_USER}"
            PRODUCTION_SSH_PORT: "${PRODUCTION_SSH_PORT}"
            PRODUCTION_SSH_PASS: "${PRODUCTION_SSH_PASS}"
            STAGING_URL: "${STAGING_URL}"
            STAGING_DIR_PATH: "${STAGING_DIR_PATH}"
            STAGING_DB_NAME: "${STAGING_DB_NAME}"
            STAGING_DB_USER: "${STAGING_DB_USER}"
            STAGING_DB_PASSWORD: "${STAGING_DB_PASSWORD}"
            STAGING_DB_HOST: "${STAGING_DB_HOST}"
            STAGING_DB_PORT: "${STAGING_DB_PORT}"
            STAGING_SSH_HOST: "${STAGING_SSH_HOST}"
            STAGING_SSH_USER: "${STAGING_SSH_USER}"
            STAGING_SSH_PORT: "${STAGING_SSH_PORT}"
            STAGING_SSH_PASS: "${STAGING_SSH_PASS}"
            RUBYOPT: -EUTF-8
    phpmyadmin:
        container_name: "${PRODUCTION_NAME}_pma"
        image: phpmyadmin/phpmyadmin
        restart: on-failure:5
        depends_on:
            - database
        ports:
            - 8888:80
        environment:
            PMA_HOST: database

※65行目はwordmoveのmysql dumpで使うRubyのエンコーディングをUTF8にするため

※66行目以降はphpMyAdminの導入

これで wordmove は下記で切り替えられる

$ wordmove [push / pull] -e [production / staging] -[オプション]

開始スクリプト作成

docker起動後に必要なモジュールを入れたりするためのスクリプトを準備する。

たとえば公開鍵認証でパスを要求される場合、下記の流れなのでちと面倒。

$ docker-compose up -d
$ docker exec -w /home/ -it [wordmoveのコンテナ名] /bin/bash
root@****:/home# ssh-agent bash
root@****:/home# ssh-add /home/.ssh/id_rsa 右
Enter passphrase for /home/.ssh/id_rsa: [パス入力]
Identity added: /home/.ssh/id_rsa (fordocker)

そこで自動化するために up.sh を作成。

#!/bin/sh

set -eu 

echo "Start Docker --------------------------------------"
docker-compose up -d

echo "Preparing Wordmove --------------------------------"
docker exec -w /home/ -it [wordmoveのコンテナ名] /home/setup.sh

権限付与を忘れずに。

$ chmod +x up.sh

config/setup.sh を作成。

#! /bin/sh

# 初回
apt-get update --allow-releaseinfo-change

# 2回目以降
# apt-get update -y

# SSH接続でパスワード利用の場合
apt-get install sshpass

# SSH接続で公開鍵接続も認証パスが必要になる場合
apt-get install -y expect

PS='[パスワード]'

eval `ssh-agent`

expect -c "
set timeout 3
spawn ssh-add /home/.ssh/id_rsa
expect \"Enter passphrase for /home/.ssh/id_rsa:\" 
send \"${PS}\n\"
interact
"

/bin/bash

4行目はdebianのバージョンアップなどで下記エラーが発生した場合。

E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'

10行目が無いと実行した時に下記エラーが発生する。

RSYNC: FAILED TO EXEC SSHPASS: NO SUCH FILE OR DIRECTORY (2)

13行目が無いと実行した時に下記エラーが発生したため。

expect: not found

初回のみで後はコメントアウトで良さげ。

このファイルにも権限付与を忘れずに。

$ chmod +x config/setup.sh

終了スクリプト作成

ついでに終了用作った。

stop.sh で。

#!/bin/sh

set -eu 

echo "Stop Docker --------------------------------------"

docker-compose stop

権限付与。

$ chmod +x stop.sh

完了

これで起動は ./u + tabキー、

終了は exit を1度した後に、./s + tabキーだけ。

Docker-composeでWordPress開発環境を作る+自動化” への3件のフィードバック

  1. 私も最近おなじくVCCWからDockerへ移行しました。
    ちょうどここだけ解決できずにいたところ、バッチリ解決できました。
    ありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です