※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キーだけ。
私も最近おなじくVCCWからDockerへ移行しました。
ちょうどここだけ解決できずにいたところ、バッチリ解決できました。
ありがとうございます!