先日「WordPressをDockerで立ち上げて、Gitで管理する」という試みをしましたので、その記録をまとめておきます。
前提:Dockerの構成
今回使ったdocker-compose.ymlはこちら。
WordPress、MySQL、phpMyAdminの3コンテナ構成です。
services:
db:
image: mysql:8.0
container_name: hibitsuiki_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
container_name: hibitsuiki_wp
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
phpmyadmin:
image: phpmyadmin:latest
container_name: hibitsuiki_phpmyadmin
restart: always
ports:
- "8081:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
depends_on:
- db
volumes:
db_data:
以前はパスワードなどの機密情報も書いていたのですが、安全性の観点から.envファイルに切り出すことにしました。
場所はdocker-compose.ymlと同じ階層に置いてます。
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=your_db_name
MYSQL_USER=your_user
MYSQL_PASSWORD=your_password
パスワードに|や#などの特殊文字が含まれる場合は、シングルクォートで囲まないと正しく読み込まれない場合もあるらしく注意。
Gitで管理するのはどこまで?
WordPressのファイル構成を見るとわかりますが、Git管理すべきなのは自分で書いたコードだけです。
wp-content/
├── themes/
│ ├── cocoon-master/ ← サードパーティ。Git管理しない
│ ├── cocoon-child-master/ ← 自作カスタム。ここだけGit管理する
│ └── twentytwenty*/ ← デフォルトテーマ。Git管理しない
├── plugins/ ← Git管理しない(自作プラグインを作ったら追跡すればOK)
└── uploads/ ← メディアファイル。Git管理しない
というのも、全てのファイルを追跡してしまうとリポジトリが肥大化しますし、テーマのアップデートなんかが入った場合には自分で手を加えた部分が埋もれますよね。
最悪、先祖返りしちゃったり…。
つまりcocoon-child-master/だけを追跡対象にすれば十分です。
- QWordPressの記事・設定はどこに保存される?
- A
記事はデータベース(MySQL)に保存されます。 ファイルシステム上には存在しないので、そもそもGitの対象外です。
Cocoonの設定(カラー・レイアウト等)も同様にDBに保存されます。
ただし、設定から生成されるCSSキャッシュはwp-content/uploads/cocoon-resources/css-cache/に出力されることがあります。
これは自動生成ファイルなのでGit管理には含めません。
.gitignoreの書き方
ここでちょっと手間取りました。
最初はwordpress/で丸ごと除外&子テーマだけ「!」で追跡し~ちゃお、と思っていたのですが…。
親ディレクトリが.gitignoreされていると、子ディレクトリの「!」が効かないらしい。Gitの仕様で。
解決策はwordpress/ではなくwordpress/*と書くことです。
ディレクトリ自体ではなく中身を除外することで、!の否定が正しく効くようになるんだと。なるほど。
# 機密情報
.env
# WordPress(自作テーマ以外)
wordpress/*
!wordpress/wp-content
wordpress/wp-content/*
!wordpress/wp-content/themes
wordpress/wp-content/themes/*
!wordpress/wp-content/themes/cocoon-child-master
Git初期化とコミット
あとは通常のGit操作で初期化しましょう。
$ cd ~/project/hibitsuiki
$ git init
$ git branch -m main
$ git add .
$ git commit -m "initial commit"
git statusでdocker-compose.yml、.gitignoreおよびcocoon-child-master/配下のファイルだけが表示されていれば成功です。
ファイルのパーミッション変更
./wordpress/はDockerコンテナがマウントして使うディレクトリのため、ファイルのオーナーがwww-data(Dockerの実行ユーザー)になっています。
場合によっては、事前にパーミッションを変更しておくとよいかもしれません。
$ ls -la ./wordpress/wp-content/themes/cocoon-child-master/
-rw-r--r-- 1 www-data www-data 845 May 10 11:25 style.css
...
この状態だとホストのuserがGitで読み取れず、git addしても追跡されません。
以下のコマンドでオーナーを変更すれば解決します。
$ sudo chown -R user:user ./wordpress/wp-content/themes/cocoon-child-master/
まとめ
- 記事・設定はDBに保存される → Gitの対象外
- Git管理するのは
cocoon-child-master/(自作テーマ)だけ .gitignoreはwordpress/ではなくwordpress/*で書く- ファイルオーナーが
www-dataになっている場合はchownで変更する
Gitには慣れたと思っていましたが、初歩的なところでまだまだつまづきますね~…。
今後、テーマのカスタマイズを行う際はdevelopブランチを切って作業しようと思います。
ではまた次回!
追記
WordPress子テーマのGit管理ですが、本番環境へのデプロイで盛大にこけてしまいました…。
この構成だと、VPSの子テーマディレクトリに直接git cloneできなかったんです。
.gitignoreを見れば一目瞭然ですが、余分な空っぽのディレクトリ(上位の階層)が邪魔をするんですね。
現在も正解を模索中ではありますが、下記の記事では暫定的に解決しているのでご覧ください。




