【Windows】KUSANAGI Run on Dockerでローカル環境を構築してみた

この記事はブログとプログラミングで生計をたてている海外在住ウェブディベロッパーがわかりやすさにこだわって作成しました

環境

Windows 11

WSL2

Ubuntu 20.4

Docker

Kusanagi Run on Docker

Drupal9 (latest)

Drush latest

インストール

prepare following scripts/folders

  • backup folder
    includes files/folders which needed to create docker env
  • archives folder
    includes application files (source code archive files/database sql files)
  • buildnewdocker.sh file
  • buildnewdocker.conf file
  • buildnewdocker.ini file
  • installdpapp.sh
  • installwpapp.sh
  • sw.sh

使い方

スクリプト実行形式

項目名前説明備考
コマンド名 buildnewdocker.shスクリプト本体
第一引き数 PROFILE NAME設定ファイルに定義したプロファイル名独自で設定する
後述の設定ファイルに従う
第二引き数 PROJECT FOLDERDocker環境が作成されるフォルダ名FQDN:プロジェクトフォルダ名.local
第三引き数 AUTO-EXECUTION(オプション)
1: 完了まで止まらない(自動実行)
0: ステップで実行する
未設定の場合は0

./buildnewdocker.sh {PROFILE NAME} {PROJECT FOLDER} {AUTO-EXECUTION OPTION}

Exmple:

./buildnewdocker.sh toyo-dev toyo-dev-payment-test 1

設定ファイル

基本設定

####################################
# 切要な設定はすべてここで行う
# COMMON
####################################
TLD=".local"
ARCHIVES_DIR="archives"
adminuser="admin"
adminpass="adminpass"
adminemail="admin@example.com"
dbname="database"
dbuser="dbuser"
dbpass="dbpassword"
kusanagipass="kusanagipassword"
KUSANAGIPHPSRC="kusanagi-php-php7.4"
FQDN=${TARGET}${TLD}
変数名設定値備考
BASEAPPlampkusanagi設定プロビジョン名
LAMPAPPdrupal9インストールパッケージ名
PROJAPPインストールアプリ名
COMPILEyphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEDockerバックアップから復元
MAKEDOCKERBACKUPyDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

爆速でWordPress環境を立ち上げる

設定ファイル(プロファイル名:wp)

変数名設定値備考
BASEAPPwpkusanagi設定プロビジョン名
LAMPAPPインストールパッケージ名
PROJAPPインストールアプリ名
COMPILEnphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEDockerバックアップから復元
MAKEDOCKERBACKUPyDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
if [ $PROFILE = "wp" ];then
####################################
  BASEAPP="wp"
  LAMPAPP=""
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="n"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="n"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="y"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

デバッグモードでWordPress環境を立ち上げる

設定ファイル (プロファイル名:wpxdbg)

変数名設定値備考
BASEAPPwpkusanagi設定プロビジョン名
LAMPAPPインストールパッケージ名
PROJAPPインストールアプリ名
COMPILEyphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEnDockerバックアップから復元
MAKEDOCKERBACKUPyDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
if [ $PROFILE = "wpxdbg" ];then
####################################
  BASEAPP="wp"
  LAMPAPP=""
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="y"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="n"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="y"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

爆速でLAMP環境を立ち上げる

設定ファイル (プロファイル名:lamp)

変数名設定値備考
BASEAPPlampkusanagi設定プロビジョン名
LAMPAPPインストールパッケージ名
PROJAPPインストールアプリ名
COMPILEyphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEnDockerバックアップから復元
MAKEDOCKERBACKUPyDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
# LAMP環境設定
####################################
if [ $PROFILE = "lamp" ];then
####################################
  BASEAPP="lamp"
  LAMPAPP=""
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="y"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="n"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="y"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

LAMP環境に最新のDrual9をインストールする

設定ファイル (プロファイル名:drupal9)

変数名設定内容初期値備考
TLDトップレベルドメイン.local
ARCHIVES_DIRWPなたはDrupalデータパスarchives
adminuserWORDPRESSのログインユーザ名admin
adminpass WORDPRESSのログインパスワード名adminpass
dbnameデータベース名database
dbuserデータベースユーザ名dbuser
dbpassデータベースパスワード名dbpassword
kusanagipassKUSANAGI パスワード名kusanagipassword
KUSANAGIPHPSRCKusanagiRoDのphpソースコードパスkusanagi-php-php7.4ソースコードはprime-strtegy Githubから取得済み
https://github.com/prime-strategy/kusanagi-php/tree/php7.4
※最新はphp8.1
FQDNアクセスドメイン名ターゲット名+TLD
####################################
# DRUPAL9環境設定
####################################
if [ $PROFILE = "drupal9" ];then
####################################
  BASEAPP="lamp"
   LAMPAPP="drupal9"
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="y"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="n"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="y"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

Dockerバックアップから爆速でWP環境+アプリを立ち上げる

設定ファイル (プロファイル名:restore-wp)

変数名設定値備考
BASEAPPwpkusanagi設定プロビジョン名
LAMPAPPインストールパッケージ名
PROJAPPインストールアプリ名
COMPILEnphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEyDockerバックアップから復元
MAKEDOCKERBACKUPDockerバックアップ作成
ARCHIVE_VOLUME_PHPVOL_${TARGET}_php.tar
ARCHIVE_VOLUME_DBVOL_${TARGET}_db.tar
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
if [ $PROFILE = "restore-wp" ];then
####################################
  BASEAPP="wp"
  LAMPAPP=""
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="n"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="y"
  ARCHIVE_VOLUME_PHP="VOL_${TARGET}_php.tar"
  ARCHIVE_VOLUME_DB="VOL_${TARGET}_db.tar"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="n"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

DockerバックアップからデバッグモードでWP環境+アプリを立ち上げる

設定ファイル (プロファイル名:restore-wpxdb)

変数名設定値備考
BASEAPPwpkusanagi設定プロビジョン名
LAMPAPPインストールパッケージ名
PROJAPPインストールアプリ名
COMPILEyphp再コンパイル実施
webserver–httpdウェブサービス名
phpkusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEyDockerバックアップから復元
ARCHIVE_VOLUME_PHP VOL_${TARGET}_php.tar
ARCHIVE_VOLUME_DB VOL_${TARGET}_db.tar
MAKEDOCKERBACKUPnDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
if [ $PROFILE = "restore-wpxdbg" ];then
####################################
  BASEAPP="wp"
  #LAMPAPP=""
  LAMPAPP=""
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="y"
  webserver="--httpd"
  #FOR php8.x
  php=""

  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="y"
  ARCHIVE_VOLUME_PHP="VOL_${TARGET}_php.tar"
  ARCHIVE_VOLUME_DB="VOL_${TARGET}_db.tar"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="n"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

DockerバックアップからデバッグモードでDrupal9環境+アプリを立ち上げる

設定ファイル (プロファイル名:restore-drupal9)

変数名設定値備考
BASEAPPlampkusanagi設定プロビジョン名
LAMPAPPdrupal9インストールパッケージ名
PROJAPPインストールアプリ名
COMPILEyphp再コンパイル実施
webserver–httpdウェブサービス名
php–php74kusanagi設定用PHPバージョン
RESTOREFROMDOCKERFILEDockerバックアップから復元
ARCHIVE_VOLUME_PHP VOL_${TARGET}_php.tar
ARCHIVE_VOLUME_DB VOL_${TARGET}_db.tar
MAKEDOCKERBACKUPnDockerバックアップ作成
APPDEPLOY_SCRIPTアプリバックアップ復元スクリプト
WP用:installdpapp.sh
Drupal用:installwpapp.sh

####################################
# DRUPAL9バックアップからのリストア
####################################
if [ $PROFILE = "restore-drupal9" ];then
####################################
  BASEAPP="lamp"
  #LAMPAPP=""
  LAMPAPP="drupal9"
  PROJAPP=""
  #XDEBUG/GITを追加してイメージを再生成する
  COMPILE="y"
  webserver="--httpd"
  #FOR php7.4
  php="--php74"


  #BACKUPファイルからリストアする
  RESTOREFROMDOCKERFILE="y"
  ARCHIVE_VOLUME_PHP="VOL_${TARGET}_php.tar"
  ARCHIVE_VOLUME_DB="VOL_${TARGET}_db.tar"

  #DOCKERのバックアップファイルを作成する
  MAKEDOCKERBACKUP="n"

  #スクリプト名を記述する
  #スクリプト実行環境にこのファイルが置かれていること
  APPDEPLOY_SCRIPT=

fi

スクリプトについて

バリデーションファイル

設定ファイルに設定を追加した場合は、プロファイル名をこのファイルに追加しておく

#PROFILEに定義済みデータ
array=( \
'drupal9' \
'wp' \
'wpxdbg' \
'lamp' \
'restore-wp' \
'restore-wpxdbg' \
'restore-drupal9' \
)  

スクリプトファイル説明

引き数のバリデーションチェックおよび引き数を変数に設定する

####################################
#共通で使用する情報を定義する
source /home/matsubara/buildnewdocker.ini
####################################

############################################
## 配列に対象文字列が存在するか確認する
############################################
inarray() {
    local i
    for i in ${array[@]}; do
        if [[ ${i} =  ]]; then
            return 0
        fi
    done
    return 1
}

#####################################################################################
## プロファイルに設定された環境を構築する
## 【コマンド書式】"
## buildnewdocker.sh 第一引数(必須) 第二引数(必須) 第三引数(オプション)"
## 【第一引数】(必須) buildnewdocker.confで定義したプロファイル名*を指定"
## 【第二引数】(必須) 新しく作成する仮想環境のプロビジョン名(フォルダ名)を指定"
## 【第三引数】(オプション) ステップごとに確認メッセージ表示の有無(0:STEP、1:自動) "
#####################################################################################
if inarray "$1";then
    echo "profile check ok"
else    
    echo "profile check ng"
fi
echo count=$#
if [ $# -eq 1 ] && [ "$1" = "allstop" ];then
    echo "現在起動中のコンテナをすべて停止する"
    docker stop $(docker ps -q)
    echo "完了しました"
    exit 0
elif [ $# -eq 2 ] && [ "$1" = "sw" ];then
    if [ ! -d ./"$2" ];then
        echo "対象のプロビジョンが存在しません"
	exit 1
    fi
    echo "現在起動中のコンテナをすべて停止する"
    docker stop $(docker ps -q)
    cd /home/matsubara/$2
    kusanagi-docker start
    cd /home/matsubara
    echo "完了しました"
    exit 0
elif [ $# -eq 2 ] && inarray "$1";then
    PROFILE=$1
    TARGET=$2
    autoexec=0
elif [ $# -eq 3 ] && inarray "$1";then
    PROFILE=$1
    TARGET=$2
    autoexec=$3
else
    echo "引数を確認してください"
    echo "【コマンド書式】"
    echo "buildnewdocker.sh 第一引数(必須) 第二引数(必須) 第三引数(オプション)"
    echo "【第一引数】(必須) buildnewdocker.confで定義したプロファイル名*を指定"
    echo "【第二引数】(必須) 新しく作成する仮想環境のプロビジョン名(フォルダ名)を指定"
    echo "【第三引数】(オプション) ステップごとに確認メッセージ表示の有無(0:STEP、1:自動) "
    IFS=','
    echo "*有効なプロファイル名: ${array[*]} "
    exit 1
    #autoexec=0
fi
####################################

先に設定済みの設定ファイルをここで読み込む。確認のため設定内容を表示する。

####################################
#上記設定は環境設定ファイルに一元化した
source ./buildnewdocker.conf
####################################

## ---------------------------------
echo "プロビジョニング:${TARGET} を作成します。すでにある場合は削除されますのでご注意ください"
echo "PROFILEは、${PROFILE}"
echo "TARGETは、${TARGET}"
echo "BASEAPPは、${BASEAPP}です。"
if [ "$BASEAPP" = "lamp" ];then echo "LAMPAPPは、${LAMPAPP}"; fi
echo "PROJAPPは、${PROJAPP}"
echo "FQDNは、${FQDN}です。"
echo "autoexec=${autoexec}"
echo "KUSANAGIPHPSRC=${KUSANAGIPHPSRC}"
echo "/windows/system32/drivers/etc/hostsで上記FDQNが127.0.0.1に紐付けられていることを確認ください"
if [ $autoexec -eq 1 ];then echo "完了するまで止まりません"; fi
read -p "Press [Enter] key to move on to the next."

コンテナを停止、対象フォルダを削除する

echo "現在起動中のコンテナをすべて停止する"
docker stop $(docker ps -q)

#削除
echo "【KusanagiRoD】対象のプロビジョニングが既に存在する場合は削除する"
chmod 777 /home/matsubara/${TARGET}/contents/ -R  > /dev/null 

kusanagi-docker remove ${TARGET}

Kusanagiコマンドで新規プロビジョニングを作成する

## ---------------------------------
echo "【KusanagiRoD】プロビジョニングを作成する"
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi

if [ $BASEAPP = "wp" ];then
echo "【KusanagiRoD】WordPress環境生成"
#echo "kusanagi-docker provision --wp ${webserver} --wplang=ja --admin-user=sinceretechnology --admin-pass=wordpress --admin-email=admin@sinceretechnology.com.au --wp-title=WordPress --kusanagi-pass=${kusanagipass} --dbname=wordpress --dbuser=wordpress --dbpass=wordpress --http-port=80 --tls-port=443 --fqdn ${TARGET}${TLD} ${TARGET}"

kusanagi-docker provision --wp ${webserver} --wplang=ja --admin-user=${adminuser} --admin-pass=${adminpass} --admin-email=${adminemail} --wp-title=WordPress --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${TARGET}${TLD} ${TARGET}


elif [ $BASEAPP = "drupal8" ];then
echo "【KusanagiRoD】Drupal8環境構築"
	kusanagi-docker provision --drupal8 ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${TARGET}${TLD} ${TARGET}
elif [ $BASEAPP = "lamp" ];then
echo "【KusanagiRoD】LAMP環境構築"
kusanagi-docker provision --lamp ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${TARGET}${TLD} ${TARGET}
else
    echo "Application type is not defined!!"
    echo "Terminate abnormally!!!!!"
    exit 1
fi

## ---------------------------------
echo "【KusanagiRoD】環境構築完了しました"
echo "http://${TARGET}${TLD} にアクセスして確認してください"
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi

コンパイルがYの場合は、Docker設定ファイルを以下のように書き換えてphpサービス用ソースコードをコンパイルする設定にする

  • docker-compose.ymlのphpサービス部分の設定を書き換え、イメージ読み込みからDockerfileによりコンパイルするように変更する
  • phpのソースコードとDockerfileを格納したフォルダをプロジェクトフォルダ配下に転送する

docker-compose.yml

抜粋 
 php:
    container_name: toyo-dev_php
    #image: primestrategy/kusanagi-php:7.4.28-r5
    build:
      context: ./kusanagi-php-php7.4
      dockerfile: Dockerfile
if [ $COMPILE = "y" ];then
echo "【PHPDocker環境】phpコンテナに開発用サービスをを追加する"
echo "コンパイル用ソース一式を${KUSANAGIPHPSRC}に取得・コンパイルしてイメージを再構築する"
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
## ---------------------------------
cd /home/matsubara/backup
mkdir /home/matsubara/${TARGET}/contents/DocumentRoot/temp
echo "【PHPDocker環境】phpコンテナ用Dockerfileを取得する"
cp -rf /home/matsubara/backup/${KUSANAGIPHPSRC} /home/matsubara/${TARGET}


echo "【PHPDocker環境】docker-compose.ymlの設定を変更する"
cp /home/matsubara/${TARGET}/docker-compose.yml /home/matsubara/${TARGET}/docker-compose.yml.bak
#cp /home/matsubara/backup/docker-compose.yml.template /home/matsubara/${TARGET}/docker-compose.yml

#PHPにBUILDを追加する
sed -i "/image: primestrategy\/kusanagi-php/a \    build:\n      context: ./${KUSANAGIPHPSRC}\n      dockerfile: Dockerfile" /home/matsubara/${TARGET}/docker-compose.yml  #del > /home/matsubara/${TARGET}/docker-compose.yml.temp
#PHPのIMAGEをコメントアウトする
sed -i "s/image: primestrategy\/kusanagi-php/#image: primestrategy\/kusanagi-php/" /home/matsubara/${TARGET}/docker-compose.yml #del > /home/matsubara/${TARGET}/docker-compose.yml

echo "Complete!"
## ---------------------------------
fi

コンパイルがYの場合は、起動中のコンテナを削除して、先に書き換えたDocker設定ファイルとphpサービス用ソースコードで再コンパイルを行う。コンパイルしない場合はコンテナの再起動を行う。

 docker-compose down
 docker-compose build
 docker-compose up -d
#<<COMMENTOUT
# コンパイルありまたはスクリプトを実行した場合はコンテナの再起動を行う
cd /home/matsubara/${TARGET}
if [ "$COMPILE" = "y" ];then
## ---------------------------------
echo "現在のディレクトリ: /home/matsubara/${TARGET}"
echo "===== コンテナを再構築する ====="
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
echo " 起動中コンテナを削除する(1/4)"
 docker-compose down
echo " コンテナをコンパイルする(2/4)"
 docker-compose build
echo " コンテナを構築・起動する(3/4)"
 docker-compose up -d
#echo " コンテナデータを取得する(4/4)"
# kusanagi-docker config pull
else
echo " すべてのコンテナを再起動する"
 kusanagi-docker restart
fi
echo "Complete!"
## ---------------------------------
#COMMENTOUT

DockerコマンドとcomposerコマンドでDrupal9の設定環境を下記コマンドでコンテナ内に直接構築する

composer create-project drupal/recommended-project DRUPALプロジェクトフォルダ名

プロジェクトフォルダ名には、DocumentRoot固定のフォルダ名を設定する。APACHEなどウェブサーバーに設定する実際のドキュメントルートは配下に生成されるwebフォルダが設定される(後述)

#########################################
## ここから Drupal9用の処理を記述する  ##
#########################################
## ---------------------------------
if [ $BASEAPP = "lamp" ] && [ $LAMPAPP = "drupal9" ];then
## ---------------------------------
echo "【PHPDocker環境】Drupal9.3をインストールする"
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
# Drupalプロジェクト作成のためDocumentRootフォルダをいったん削除する
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& rm -rf ./DocumentRoot"

# DrupalをComposerでインストールする
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& composer create-project drupal/recommended-project \
	./DocumentRoot"
## ---------------------------------

DRUPALディレクトリのパーミッションの変更とメディアディレクトリ作成を行う

###########################################################
## これがないとCSSが適用されない
## 翻訳ファイル用フォルダや設定ファイルは自動生成されない?
###########################################################

## ---------------------------------
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& mkdir ./DocumentRoot/web/sites/default/files "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& mkdir ./DocumentRoot/web/sites/default/files/translations "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot/web/sites/default/ \
	&& cp ./default.settings.php \
	      ./settings.php "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET} \
	&& chmod 777 ./DocumentRoot -R"
## ---------------------------------

DockerコマンドとcomposerコマンドでDrushおよびDRUSH LAUNCHERの設定環境をコンテナ内に直接構築する(DOCKER内で下記のコマンドを実行する)

composer require drush/drush
## ---------------------------------
echo "【PHPDocker環境】DRUSHをインストールする"
if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi

# Drush latest version
# https://www.drupal.org/docs/develop/using-composer/using-composer-to-install-drupal-and-manage-dependencies
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot \
	&& composer require drush/drush"
## ---------------------------------

## ---------------------------------
echo "【PHPDocker環境】DRUSH LAUNCHERをインストールする"
#DRUSHを起動するためのスクリプト
docker cp /home/matsubara/backup/drush.phar \
	${TARGET}_php:/home/kusanagi/${TARGET}/DocumentRoot/drush.phar

docker exec -it --user root ${TARGET}_php \
	chmod +x /home/kusanagi/${TARGET}/DocumentRoot/drush
## ---------------------------------

kusanagiRoDの設定ファイル .kusanagi に設定されているドキュメントルートを変更する

APACHEなどウェブサーバーに設定する実際のドキュメントルートは配下に生成されるwebフォルダを設定する

####################################
## NOTICE!!!!!!
## DRUSH RCをするとエラーになる件
## PHPのMEMORY_LIMITを512MGにする
## https://support-acquia.force.com/s/article/360005311613-Increasing-the-memory-limit-for-Drush
##
## Add blow code to settings.php file.  
## -------------------
## if (PHP_SAPI === 'cli') {
##   ini_set('memory_limit', '512M');
## }
## -------------------
####################################
## ---------------------------------
echo "【KusanagiRoD】ドキュメントルートを変更する"
# .kusanagiファイルのドキュメントルート設定を変更する。
# 再起動後に反映される
cp  /home/matsubara/${TARGET}/.kusanagi \
    /home/matsubara/${TARGET}/.kusanagi.bak
sed 's/\/DocumentRoot/\/DocumentRoot\/web/' \
    /home/matsubara/${TARGET}/.kusanagi.bak \
    > /home/matsubara/${TARGET}/.kusanagi.temp
sed 's/ROOT_DIR=DocumentRoot/ROOT_DIR=web/' \
    /home/matsubara/${TARGET}/.kusanagi.temp \
    > /home/matsubara/${TARGET}/.kusanagi
fi

ドキュメントルートにツールをインストールする

###########################################################
## ドキュメントルートにデータベースツール他ファイルを転送
###########################################################
## ---------------------------------
if [ $BASEAPP = "lamp" ] && [ $LAMPAPP = "drupal9" ];then
    DOCROOT=DocumentRoot/web
else
    DOCROOT=DocumentRoot
fi
echo "ドキュメントルートにデータベースツール他ファイルを転送する"
docker cp /home/matsubara/backup/phpinfo.php \
        ${TARGET}_php:/home/kusanagi/${TARGET}/${DOCROOT}/phpinfo.php
docker cp /home/matsubara/backup/adminer.php \
        ${TARGET}_php:/home/kusanagi/${TARGET}/${DOCROOT}/adminer.php
## ---------------------------------

Drupal9インストールをDRUSHの下記コマンドで行う

php drush.phar site:install \
  --db-url=mysql://DBユーザ:DBパスワード@ホスト名:ポート番号/データベース名 \
  --account-name=ADMINユーザ \
  --account-pass=ADMINパスワード
###########################################################
## Drupalサイト構築をDrushから実行する
###########################################################
## ---------------------------------
#https://drushcommands.com/drush-9x/site/site:install/
#https://www.white-root.com/drush-commands/site_install
if [ $BASEAPP = "lamp" ] && [ $LAMPAPP = "drupal9" ];then
echo "Drupalサイト構築をDrushから実行する(通常GUIで行う設定が不要)"

if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
#INSTALL DRUPAL9
docker exec -it --user root ${TARGET}_php \
        /bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot \
	&& php drush.phar site:install \
	--db-url=mysql://${dbuser}:${dbpass}@localhost:3306/${dbname} \
	--account-name=${adminuser} \
	--account-pass=${adminpass} "
## ---------------------------------

ローカル環境で有効なデバックモードの設定を行う

###########################################################
## DEBUGモードを設定する
###########################################################
## ---------------------------------
#SET DEBUG MODE
docker exec -it --user root ${TARGET}_php \
  /bin/sh -c \
  "cd /home/kusanagi/${TARGET}/DocumentRoot/web/sites \
    && cp ./example.settings.local.php ./default/settings.local.php \
    && sed -i -e \"$ a if (file_exists(__DIR__ . '/settings.local.php')) {\n \
    include __DIR__ . '/settings.local.php';\n}\n\" \
    ./default/settings.php"
#COPY CONFIG FILE(settings.local.php) FOR DEBUG
docker cp /home/matsubara/backup/settings.local.php \
	${TARGET}_php:/home/kusanagi/toyo-dev/DocumentRoot/web/sites/default/settings.local.php
#COPY CONFIG FILE(development.services.yml) FOR DEBUG
docker cp /home/matsubara/backup/development.services.yml \
	${TARGET}_php:/home/kusanagi/toyo-dev/DocumentRoot/web/sites/development.services.yml
fi
## ---------------------------------

コンパイルがYの場合は、ここでコンテナに再構築を行う(コンパイルは実施済みのためしない)
コンパイルしない場合はkusanagiコマンドでコンテナの再起動のみ行う。

## ---------------------------------
# コンパイルありまたはスクリプトを実行した場合はコンテナの再起動を行う
cd /home/matsubara/${TARGET}
if [ "$COMPILE" = "y" ];then
  echo "現在のディレクトリ: /home/matsubara/${TARGET}"
  echo "===== コンテナを再構築する ====="
  if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
  echo " 起動中コンテナを削除する(1/4)"
  docker-compose down
  #echo " コンテナをコンパイルする(2/4)"
  # docker-compose build
  echo " コンテナを構築・起動する(3/4)"
  docker-compose up -d
  #echo " コンテナデータを取得する(4/4)"
  # kusanagi-docker config pull 
else
echo " すべてのコンテナを再起動する"
  kusanagi-docker restart
fi
echo "Complete!"
## ---------------------------------

Drupal9インストールの場合はキャッシュをクリアする

php drush.phar cr
if [ $BASEAPP = "lamp" ] && [ $LAMPAPP = "drupal9" ];then
  echo "すべてのキャッシュをクリアする"
  docker exec -it --user root ${TARGET}_php \
    /bin/sh -c \
    "cd /home/kusanagi/${TARGET}/DocumentRoot \
      && php drush.phar cr"
fi
## ---------------------------------

アプリのバックアップからインストールをする場合はここで行う

※設定ファイルに指定された別途作成したスクリプトを実行することができる

#########################################
## ここからデプロイしたいアプリがあれば
## サブスクリプトを呼び出して実行する
#########################################
# 
## ---------------------------------
if [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ -e "/home/matsubara/$APPDEPLOY_SCRIPT" ]; then
    #スクリプトの実行
    echo "プロファイルに指定されたスクリプトを実行する"
    echo "【スクリプト】source /home/matsubara/${APPDEPLOY_SCRIPT} ${TARGET} ${autoexec}"
    source /home/matsubara/${APPDEPLOY_SCRIPT} ${PROFILE} ${TARGET} ${autoexec}
elif [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ ! -e "/home/matsubara/$APPDEPLOY_SCRIPT" ]; then
    echo "エラーにより処理を中断しました"
    echo "アプリデプロイ用スクリプトが存在しません!!"
    echo "アプリのデプロイが必要な場合は手動でスクリプトを起動してください"
    exit 1
fi
## ---------------------------------

Dockerバックアップから復元する設定の場合はここで行う

以下のDOCKERコマンドを使用してDBとPHPそれぞれのDOCKER内データを復元する

  docker run --rm --volumes-from {対象コンテナ名} -v 
{ホスト側アーカイブフォルダパス}:/backup busybox tar xvf /backup/{アーカイブファイル名}
## ---------------------------------
if [ ${RESTOREFROMDOCKERFILE} = "y" ];then
  echo "バックアップからコンテナイメージとボリューム(DB含むデータ)をリストアする"
  if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
  #Volumeバックアップを取得する
  echo "phpコンテナをリストアする"
  docker run --rm --volumes-from ${TARGET}_php -v /home/matsubara/${ARCHIVES_DIR}:/backup busybox tar xvf /backup/${ARCHIVE_VOLUME_PHP}
  echo "dbコンテナをリストアする"
  docker run --rm --volumes-from ${TARGET}_db -v /home/matsubara/${ARCHIVES_DIR}:/backup busybox tar xvf /backup/${ARCHIVE_VOLUME_DB}
fi
## ---------------------------------

## ---------------------------------
cd /home/matsubara/${TARGET}
echo "現在のディレクトリ: /home/matsubara/${TARGET}"
echo " すべてのコンテナを再起動する"
 kusanagi-docker restart
## ---------------------------------

DockerイメージとDocker内データのバックアップをする設定の場合はここで行う

以下のDOCKERコマンドを使用してDBとPHPそれぞれのDOCKER内データをバックアップする

  docker run --rm --volumes-from {対象コンテナ名} -v {ホスト側アーカイブフォルダパス}:/backup busybox tar cf /backup/{バックアップファイル名} {コンテナ内バックアップ対象フォルダ}
## ---------------------------------
if [ ${MAKEDOCKERBACKUP} = "y" ];then
  echo "再構築したコンテナイメージとボリューム(DB含むデータ)のバックアップを取得する"
  if [ $autoexec -eq 0 ];then read -p "Press [Enter] key to move on to the next."; fi
  #BUILDで作成したIMAGEのバックアップ
  docker save ${TARGET}_php:latest > /home/matsubara/${TARGET}/IMG_${TARGET}_php.tar
  #Volumeバックアップを取得する
  docker run --rm --volumes-from ${TARGET}_php -v /home/matsubara/${TARGET}:/backup busybox tar cf /backup/VOL_${TARGET}_php.tar /home/kusanagi
  docker run --rm --volumes-from ${TARGET}_db -v /home/matsubara/${TARGET}:/backup busybox tar cf /backup/VOL_${TARGET}_db.tar /var/lib/mysql
fi

KusanagiのpullコマンドでDocker内データを共有フォルダに取得する

kusanagi-docker config pull
## ---------------------------------
cd /home/matsubara/${TARGET}
echo "コンテナ内データをcontentsフォルダに取得する"
kusanagi-docker config pull
## ---------------------------------


echo "complete successfully!!!!!!!!"
exit 0

以上

スクリプト全体

ホームディレクトリのパス名など修正が必要な箇所は多々ありますが、参考までに公開します。ぜひ参考にしてください。

メインスクリプト

####################################
#引数のチェック&取得、変数に設定する
source ${HOME_DIR}buildnewdocker_init.sh
####################################

echo "/windows/system32/drivers/etc/hostsで上記FDQNが127.0.0.1に紐付けられていることを確認ください"
if [ -z "$debugmode" ];then echo "完了するまで止まりません"; fi
read -p "Press [Enter] key to move on to the next." 


echo "現在起動中のコンテナをすべて停止する"
docker stop $(docker ps -q)

#削除
if [ -d "${HOME_DIR}${TARGET}" ]; then
  echo "【KusanagiRoD】対象のプロビジョニングが既に存在する場合は削除する"
  chmod 777 ${HOME_DIR}${TARGET}/contents/ -R  > /dev/null 
  kusanagi-docker remove ${TARGET}
  echo "【KusanagiRoD】既存のプロビジョニングの削除を完了しました"
else
  echo "対象プロビジョニング存在チェックOK"
ls ${HOME_DIR}${TARGET}
fi

## ---------------------------------
echo "【KusanagiRoD】プロビジョニングを作成する"
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi

if [ "$BASEAPP" = "wp" ];then
echo "【KusanagiRoD】WordPress環境生成"
#echo "kusanagi-docker provision --wp ${webserver} --wplang=ja --admin-user=sinceretechnology --admin-pass=wordpress --admin-email=admin@sinceretechnology.com.au --wp-title=WordPress --kusanagi-pass=${kusanagipass} --dbname=wordpress --dbuser=wordpress --dbpass=wordpress --http-port=80 --tls-port=443 --fqdn ${TARGET}${TLD} ${TARGET}"

echo "kusanagi-docker provision --wp ${webserver} --wplang=ja --admin-user=${adminuser} --admin-pass=${adminpass} --admin-email=${adminemail} --wp-title=WordPress --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}"
kusanagi-docker provision --wp ${webserver} --wplang=ja --admin-user=${adminuser} --admin-pass=${adminpass} --admin-email=${adminemail} --wp-title=WordPress --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}


elif [ "$BASEAPP" = "drupal8" ];then
echo "【KusanagiRoD】Drupal8環境構築"
echo "kusanagi-docker provision --drupal8 ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}"
kusanagi-docker provision --drupal8 ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}
elif [ "$BASEAPP" = "lamp" ];then
echo "【KusanagiRoD】LAMP環境構築"
echo "kusanagi-docker provision --lamp ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}"
kusanagi-docker provision --lamp ${webserver} ${php} --kusanagi-pass=${kusanagipass} --dbname=${dbname} --dbuser=${dbuser} --dbpass=${dbpass} --http-port=80 --tls-port=443 --fqdn ${FQDN} ${TARGET}
else
    echo "Application type is not defined!!"
    echo "Terminate abnormally!!!!!"
    exit 1
fi

## ---------------------------------
echo "【KusanagiRoD】環境構築完了しました"
echo "http://${TARGET}${TLD} にアクセスして確認してください"
echo "【注意】Dockerのネットワークエラーが発生した場合は、不要なネットワークを削除してください"
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi


if [ "$COMPILE" = "y" ];then
echo "【PHPDocker環境】phpコンテナに開発用サービスをを追加する"
echo "コンパイル用ソース一式を${KUSANAGIPHPSRC}に取得・コンパイルしてイメージを再構築する"
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
## ---------------------------------
cd ${HOME_DIR}backup
mkdir ${HOME_DIR}${TARGET}/contents/DocumentRoot/temp
echo "【PHPDocker環境】phpコンテナ用Dockerfileを取得する"
cp -rf ${HOME_DIR}backup/${KUSANAGIPHPSRC} ${HOME_DIR}${TARGET}


echo "【PHPDocker環境】docker-compose.ymlの設定を変更する"
cp ${HOME_DIR}${TARGET}/docker-compose.yml ${HOME_DIR}${TARGET}/docker-compose.yml.bak
#cp ${HOME_DIR}backup/docker-compose.yml.template ${HOME_DIR}${TARGET}/docker-compose.yml

#PHPにBUILDを追加する
sed -i "/image: primestrategy\/kusanagi-php/a \    build:\n      context: ./${KUSANAGIPHPSRC}\n      dockerfile: Dockerfile" ${HOME_DIR}${TARGET}/docker-compose.yml  #del > ${HOME_DIR}${TARGET}/docker-compose.yml.temp
#PHPのIMAGEをコメントアウトする
sed -i "s/image: primestrategy\/kusanagi-php/#image: primestrategy\/kusanagi-php/" ${HOME_DIR}${TARGET}/docker-compose.yml #del > ${HOME_DIR}${TARGET}/docker-compose.yml

echo "Complete!"
## ---------------------------------
fi

if [ "$RESTOREIMAGE" = "y" ];then
echo "【PHPDocker環境】Docker imageを復元する"
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
  #BUILDで作成したIMAGEのバックアップ
  #docker image save ${TARGET}_php:latest > ${HOME_DIR}${TARGET}/IMG_${TARGET}_php.tar
  #BUILDで作成したIMAGEの復元
  T="${HOME_DIR}${ARCHIVES_DIR}/${ARCHIVE_IMAGE_PHP}"; if [ ! -e $T ];then echo "${T} が存在しません"; exit 0; fi
  docker image load < ${HOME_DIR}${ARCHIVES_DIR}/${ARCHIVE_IMAGE_PHP}

  # TODO: ここで旧DOCKER IMAGE名を新しい名前 ${TARGET}_PHP にリネームする
  # TODO: プロファイル名のフォルダが作成されているためIMAGE名だけ変更しても不可
  # TODO: /home/kusanagiの下のフォルダ名をプロファイル名($TARGET)に変更する必要あり

  # イメージ名を${ORGTARGET}_phpから"${TARGET}_php"に変更する
  if [ -n "${ORGTARGET}" ] && [ "${ORGTARGET}" != "${TARGET}" ];then
    # https://qiita.com/hirocueki/items/4f077795ac8d94c6ad8f
    echo "【PHPDocker環境】インポートしたIMAGEの名前を変更する(${ORGTARGET}_php -> ${TARGET}_php)"
    temp=`docker ps -aq --filter name=tempdockercanbedelete`
    if [ -n "$temp" ]; then
      docker rm $temp
    fi
    docker run -d --name="tempdockercanbedelete" ${ORGTARGET}_php
    docker commit tempdockercanbedelete "${TARGET}_php"
    docker stop tempdockercanbedelete
    docker rm tempdockercanbedelete
    docker rmi ${ORGTARGET}_php
  fi

  echo "【PHPDocker環境】docker-compose.ymlのphpサービスのIMAGEを変更する"
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi

  #PHPにBUILDを追加する
  sed -i "/image: primestrategy\/kusanagi-php/a \    image: ${TARGET}_php \n" ${HOME_DIR}${TARGET}/docker-compose.yml
  sed -i "s/image: primestrategy\/kusanagi-php/#image: primestrategy\/kusanagi-php/" ${HOME_DIR}${TARGET}/docker-compose.yml
  echo "【PHPDocker環境】docker-compose.ymlのphpサービスのIMAGEを変更完了"
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
fi

# コンパイルありまたはスクリプトを実行した場合はコンテナの再起動を行う
cd ${HOME_DIR}${TARGET}
if [ "$COMPILE" = "y" ] || [ "$RESTOREIMAGE" = "y" ];then
## ---------------------------------
echo "現在のディレクトリ: ${HOME_DIR}${TARGET}"
echo "===== コンテナを再構築する ====="
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
echo " 起動中コンテナを削除する(1/4)"
 docker-compose down
echo " コンテナをコンパイルする(2/4)"
 docker-compose build
echo " コンテナを構築・起動する(3/4)"
 docker-compose up -d
#echo " コンテナデータを取得する(4/4)"
# kusanagi-docker config pull
else
echo " すべてのコンテナを再起動する"
 kusanagi-docker restart
fi
echo "Complete!"
## ---------------------------------

#########################################
## ここから Drupal9用の処理を記述する  ##
#########################################
## ---------------------------------
if [ "$BASEAPP" = "lamp" ] && [ "$LAMPAPP" = "drupal9" ];then
## ---------------------------------
echo "【PHPDocker環境】Drupal9.3をインストールする"
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
# Drupalプロジェクト作成のためDocumentRootフォルダをいったん削除する
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& rm -rf ./DocumentRoot"

# DrupalをComposerでインストールする
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& composer create-project drupal/recommended-project${DRUPAL_VER} \
	./DocumentRoot"
## ---------------------------------

###########################################################
## これがないとCSSが適用されない
## 翻訳ファイル用フォルダや設定ファイルは自動生成されない?
###########################################################

## ---------------------------------
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& mkdir ./DocumentRoot/web/sites/default/files "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/ \
	&& mkdir ./DocumentRoot/web/sites/default/files/translations "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot/web/sites/default/ \
	&& cp ./default.settings.php \
	      ./settings.php "
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET} \
	&& chmod 777 ./DocumentRoot -R"
## ---------------------------------

## ---------------------------------
echo "【PHPDocker環境】DRUSHをインストールする"
if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi

# Drush latest version
# https://www.drupal.org/docs/develop/using-composer/using-composer-to-install-drupal-and-manage-dependencies
docker exec -it --user root ${TARGET}_php \
	/bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot \
	&& composer require drush/drush"
## ---------------------------------

## ---------------------------------
echo "【PHPDocker環境】DRUSH LAUNCHERをインストールする"
#DRUSHを起動するためのスクリプト
docker cp ${HOME_DIR}backup/drush.phar \
	${TARGET}_php:/home/kusanagi/${TARGET}/DocumentRoot/drush.phar

docker exec -it --user root ${TARGET}_php \
	chmod +x /home/kusanagi/${TARGET}/DocumentRoot/drush
## ---------------------------------
####################################
## NOTICE!!!!!!
## DRUSH RCをするとエラーになる件
## PHPのMEMORY_LIMITを512MGにする
## https://support-acquia.force.com/s/article/360005311613-Increasing-the-memory-limit-for-Drush
##
## Add blow code to settings.php file.  
## -------------------
## if (PHP_SAPI === 'cli') {
##   ini_set('memory_limit', '512M');
## }
## -------------------
####################################
fi

###########################################################
## ドキュメントルートにデータベースツール他ファイルを転送
###########################################################
#.kusanagiのBAKファイルを作成する
cp  ${HOME_DIR}${TARGET}/.kusanagi \
    ${HOME_DIR}${TARGET}/.kusanagi.bak
## ---------------------------------
if [ -n "$DOCUMENTROOT" ]; then
    ## ---------------------------------
    echo "【KusanagiRoD】ドキュメントルートを変更する"
    # .kusanagiファイルのドキュメントルート設定を変更する。
    # 再起動後に反映される
    #sed -i "s/\/DocumentRoot/\/DocumentRoot\/web/" \
    #    ${HOME_DIR}${TARGET}/.kusanagi
    sed -i "s/\/DocumentRoot/\/${DOCUMENTROOT}/" \
        ${HOME_DIR}${TARGET}/.kusanagi
    #ドキュメントルート用変数の設定
    DOCROOT=DocumentRoot/web
else
    #ドキュメントルート用変数の設定
    DOCROOT=DocumentRoot
fi
## ---------------------------------
if [ -n "$ROOT_DIR" ]; then
    ## ---------------------------------
    echo "【KusanagiRoD】ドキュメントルートを変更する"
    # .kusanagiファイルのドキュメントルート設定を変更する。
    # 再起動後に反映される
    #sed -i "s/ROOT_DIR=DocumentRoot/ROOT_DIR=web/" \
    #    ${HOME_DIR}${TARGET}/.kusanagi
    sed -i "s/ROOT_DIR=DocumentRoot/ROOT_DIR=${ROOT_DIR}/" \
        ${HOME_DIR}${TARGET}/.kusanagi
fi
## ---------------------------------

###########################################################
## Drupalサイト構築をDrushから実行する
###########################################################
## ---------------------------------
#https://drushcommands.com/drush-9x/site/site:install/
#https://www.white-root.com/drush-commands/site_install
if [ "$BASEAPP" = "lamp" ] && [ "$LAMPAPP" = "drupal9" ];then
echo "Drupalサイト構築をDrushから実行する(通常GUIで行う設定が不要)"

if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
#INSTALL DRUPAL9
docker exec -it --user root ${TARGET}_php \
        /bin/sh -c \
	"cd /home/kusanagi/${TARGET}/DocumentRoot \
	&& php drush.phar site:install \
	--db-url=mysql://${dbuser}:${dbpass}@localhost:3306/${dbname} \
	--account-name=${adminuser} \
	--account-pass=${adminpass} "
## ---------------------------------

###########################################################
## DEBUGモードを設定する
###########################################################
## ---------------------------------
#SET DEBUG MODE
docker exec -it --user root ${TARGET}_php \
  /bin/sh -c \
  "cd /home/kusanagi/${TARGET}/DocumentRoot/web/sites \
    && cp ./example.settings.local.php ./default/settings.local.php \
    && sed -i -e \"$ a if (file_exists(__DIR__ . '/settings.local.php')) {\n \
    include __DIR__ . '/settings.local.php';\n}\n\" \
    ./default/settings.php"
#COPY CONFIG FILE(settings.local.php) FOR DEBUG
docker cp ${HOME_DIR}backup/settings.local.php \
	${TARGET}_php:/home/kusanagi/toyo-dev/DocumentRoot/web/sites/default/settings.local.php
#COPY CONFIG FILE(development.services.yml) FOR DEBUG
docker cp ${HOME_DIR}backup/development.services.yml \
	${TARGET}_php:/home/kusanagi/toyo-dev/DocumentRoot/web/sites/development.services.yml
fi
## ---------------------------------

#########################################
## ここからデプロイしたいアプリがあれば
## サブスクリプトを呼び出して実行する
#########################################
# 
## ---------------------------------
if [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ -e "${HOME_DIR}$APPDEPLOY_SCRIPT" ]; then
    #スクリプトの実行
    echo "プロファイルに指定されたスクリプトを実行する"
    echo "【スクリプト】source ${HOME_DIR}${APPDEPLOY_SCRIPT} ${TARGET} ${debugmode}"
    #source ${HOME_DIR}${APPDEPLOY_SCRIPT} ${PROFILE} ${TARGET} ${debugmode}
elif [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ ! -e "${HOME_DIR}$APPDEPLOY_SCRIPT" ]; then
    echo "エラーにより処理を中断しました"
    echo "アプリデプロイ用スクリプトが存在しません!!"
    echo "アプリのデプロイが必要な場合は手動でスクリプトを起動してください"
    exit 1
fi
## ---------------------------------

## ---------------------------------
# コンパイルありまたはスクリプトを実行した場合はコンテナの再起動を行う
cd ${HOME_DIR}${TARGET}
if [ "$COMPILE" = "y" ];then
  echo "現在のディレクトリ: ${HOME_DIR}${TARGET}"
  echo "===== コンテナを再構築する ====="
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
  echo " 起動中コンテナを削除する(1/4)"
  docker-compose down
  #echo " コンテナをコンパイルする(2/4)"
  # docker-compose build
  echo " コンテナを構築・起動する(3/4)"
  docker-compose up -d
  #echo " コンテナデータを取得する(4/4)"
  # kusanagi-docker config pull 
else
echo " すべてのコンテナを再起動する"
  kusanagi-docker restart
fi
echo "Complete!"
## ---------------------------------

if [ "$BASEAPP" = "lamp" ] && [ "$LAMPAPP" = "drupal9" ];then
  echo "すべてのキャッシュをクリアする"
  docker exec -it --user root ${TARGET}_php \
    /bin/sh -c \
    "cd /home/kusanagi/${TARGET}/DocumentRoot \
      && php drush.phar cr"
fi
## ---------------------------------

## ---------------------------------
if [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ -e "${HOME_DIR}$APPDEPLOY_SCRIPT" ]; then
    #スクリプトの実行
    echo "プロファイルに指定されたスクリプトを実行する"
    echo "【スクリプト】source ${HOME_DIR}${APPDEPLOY_SCRIPT} ${TARGET} ${debugmode}"
    source ${HOME_DIR}${APPDEPLOY_SCRIPT} ${PROFILE} ${TARGET} ${debugmode}
elif [ -n "$APPDEPLOY_SCRIPT" ] \
    && [ ! -e "${HOME_DIR}$APPDEPLOY_SCRIPT" ]; then
    echo "エラーにより処理を中断しました"
    echo "アプリデプロイ用スクリプトが存在しません!!"
    echo "アプリのデプロイが必要な場合は手動でスクリプトを起動してください"
    exit 1
fi
## ---------------------------------

## ---------------------------------
if [ "$RESTOREFROMDOCKERFILE" = "y" ];then
  echo "バックアップからコンテナイメージとボリューム(DB含むデータ)をリストアする"
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
  #Volumeバックアップを取得する
  echo "phpコンテナをリストアする"
  T="${HOME_DIR}${ARCHIVES_DIR}/${ARCHIVE_VOLUME_PHP}"; if [ ! -e $T ];then echo "${T} が存在しません"; exit 0; fi
  docker run --rm --volumes-from ${TARGET}_php -v ${HOME_DIR}${ARCHIVES_DIR}:/backup busybox tar xf /backup/${ARCHIVE_VOLUME_PHP}
  echo "dbコンテナをリストアする"
  T="${HOME_DIR}${ARCHIVES_DIR}/${ARCHIVE_VOLUME_DB}"; if [ ! -e $T ];then echo "${T} が存在しません"; exit 0; fi
  docker run --rm --volumes-from ${TARGET}_db -v ${HOME_DIR}${ARCHIVES_DIR}:/backup busybox tar xf /backup/${ARCHIVE_VOLUME_DB}
fi
## ---------------------------------

## ---------------------------------
if [ -n "${ORGTARGET}" ] && [ "${ORGTARGET}" != "${TARGET}" ];then
  echo "プロファイルフォルダ名を${ORGTARGET}から${TARGET}に変更する"
  docker exec -it --user root ${TARGET}_php \
    /bin/sh -c \
    "cd /home/kusanagi \
      && chmod 777 ${ORGTARGET} -R \
      && rm -rf ${TARGET} \
      && mv ${ORGTARGET} ${TARGET}"
fi
## ---------------------------------

## ---------------------------------
echo "ドキュメントルートにデータベースツール他ファイルを転送する"
docker cp ${HOME_DIR}backup/phpinfo.php \
        ${TARGET}_php:/home/kusanagi/${TARGET}/${DOCROOT}/phpinfo.php
docker cp ${HOME_DIR}backup/adminer.php \
        ${TARGET}_php:/home/kusanagi/${TARGET}/${DOCROOT}/adminer.php
## ---------------------------------

## ---------------------------------
cd ${HOME_DIR}${TARGET}
echo "現在のディレクトリ: ${HOME_DIR}${TARGET}"
echo " すべてのコンテナを再起動する"
 kusanagi-docker restart
## ---------------------------------


## ---------------------------------
if [ "$MAKEDOCKERBACKUP" = "y" ];then
  echo "再構築したコンテナイメージとボリューム(DB含むデータ)のバックアップを取得する"
  if [ -n "$debugmode" ];then read -p "Press [Enter] key to move on to the next."; fi
  #BUILDで作成したIMAGEのバックアップ
  docker image save ${TARGET}_php:latest > ${HOME_DIR}${TARGET}/IMG_${TARGET}_php.tar
  #Volumeバックアップを取得する
  docker run --rm --volumes-from ${TARGET}_php -v ${HOME_DIR}${TARGET}:/backup busybox tar cf /backup/VOL_${TARGET}_php.tar /home/kusanagi
  docker run --rm --volumes-from ${TARGET}_db -v ${HOME_DIR}${TARGET}:/backup busybox tar cf /backup/VOL_${TARGET}_db.tar /var/lib/mysql
fi

## ---------------------------------
cd ${HOME_DIR}${TARGET}
echo "コンテナ内データをcontentsフォルダに取得する"
kusanagi-docker config pull
## ---------------------------------


echo "complete successfully!!!!!!!!"
exit 0

サブスクリプト

#PROFILEに定義済みデータ
array=( \
'blogdeoshiete' \
'fuji' \
'drupal9' \
'wp' \
'wpxdbg' \
'farmnavi' \
'foodpotal' \
'toyo-new' \
'toyo-dev' \
'lamp' \
'restore-wp' \
'restore-wpxdbg' \
'restore-drupal9' \
)  


############################################
## 配列に対象文字列が存在するか確認する
############################################
inarray() {
    local i
    for i in ${array[@]}; do
        if [[ ${i} =  ]]; then
            return 0
        fi
    done
    return 1
}

#####################################################################################
## プロファイルに設定された環境を構築する
## 【コマンド書式】"
## buildnewdocker.sh 第一引数(必須) 第二引数(必須) 第三引数(オプション)"
## 【第一引数】(必須) buildnewdocker.confで定義したプロファイル名*を指定"
## 【第二引数】(必須) 新しく作成する仮想環境のプロビジョン名(フォルダ名)を指定"
## 【第三引数】(オプション) ステップごとに確認メッセージ表示の有無(0:STEP、1:自動) "
#####################################################################################
if inarray "$1";then
    echo "profile check ok"
else    
    echo "profile check ng"
fi
echo count=$#
if [ $# -eq 1 ] && [ "$1" = "allstop" ];then
    echo "現在起動中のコンテナをすべて停止する"
    docker stop $(docker ps -q)
    echo "完了しました"
    exit 0
elif [ $# -eq 2 ] && [ "$1" = "sw" ];then
    if [ ! -d ./"$2" ];then
        echo "対象のプロビジョンが存在しません"
	exit 1
    fi
    echo "現在起動中のコンテナをすべて停止する"
    docker stop $(docker ps -q)
    cd /home/matsubara/$2
    kusanagi-docker start
    cd /home/matsubara
    echo "完了しました"
    exit 0
elif [ "$1" = "restore-dockerimg" ] || [ "$1" = "restore-dockerimg2" ];then
    if [ $# -eq 4 ];then
        PROFILE=$1
        TARGET=$2
        ORGTARGET=$3
        debugmode=$4
    elif [ $# -eq 3 ];then 
        PROFILE=$1
        TARGET=$2
        ORGTARGET=$3
        debugmode=
    elif [ $# -eq 2 ];then 
        PROFILE=$1
        TARGET=$2
        OLDTARGET=$2
        debugmode=
    else
        echo "引数を確認してください"
        echo "【コマンド書式】"
        echo "buildnewdocker.sh 第一引数(必須) 第二引数(必須) 第三引数(オプション)"
        echo "【第一引数】(必須) buildnewdocker.confで定義したプロファイル名*を指定"
        echo "【第二引数】(必須) 新しく作成する仮想環境のプロビジョン名(フォルダ名)を指定"
        echo "【第三引数】(オプション) 旧仮想環境のプロビジョン名(バックアップ時のもの)を指定"
        echo "【第四引数】(オプション) ステップごとに確認メッセージ表示の有無(0:STEP、1:自動) "
        IFS=','
        echo "*有効なプロファイル名: ${array[*]} "
        exit 1
    fi
elif [ $# -eq 2 ] && inarray "$1";then
    PROFILE=$1
    TARGET=$2
    debugmode=
elif [ $# -eq 3 ] && inarray "$1";then
    PROFILE=$1
    TARGET=$2
    debugmode=$3
else
    echo "引数を確認してください"
    echo "【コマンド書式】"
    echo "buildnewdocker.sh 第一引数(必須) 第二引数(必須) 第三引数(オプション)"
    echo "【第一引数】(必須) buildnewdocker.confで定義したプロファイル名*を指定"
    echo "【第二引数】(必須) 新しく作成する仮想環境のプロビジョン名(フォルダ名)を指定"
    echo "【第三引数】(オプション) ステップごとに確認メッセージ表示の有無(0:STEP、1:自動) "
    IFS=','
    echo "*有効なプロファイル名: ${array[*]} "
    exit 1
fi
####################################

####################################
#上記設定は環境設定ファイルに一元化した
if [ -z "${HOME_DIR}" ];then  
  source ./buildnewdocker.conf
fi
####################################

## ---------------------------------
if [ -n "${HOME_DIR}" ];then  
    echo "HOME_DIR=  ${HOME_DIR} "; 
else
    echo "ホームディレクトリが設定されていません"
    exit 1
fi
echo "プロビジョニング:${TARGET} を作成します。すでにある場合は削除されますのでご注意ください"
if [ -n "${PROFILE}" ];then   echo "PROFILE=   ${PROFILE}  "; fi
if [ -n "${TARGET}" ];then    echo "TARGET=    ${TARGET}   "; fi
if [ -n "${ORGTARGET}" ];then echo "ORGTARGET= ${ORGTARGET}"; fi
if [ -n "${BASEAPP}" ];then   echo "BASEAPP=   ${BASEAPP}  "; fi
if [ -n "${LAMPAPP}" ];then   echo "LAMPAPP=   ${LAMPAPP}  "; fi
if [ -n "${PROJAPP}" ];then   echo "PROJAPP=   ${PROJAPP}  "; fi
if [ -n "${FQDN}" ];then      echo "FQDN=      ${FQDN}     "; fi

if [ -n "${KUSANAGIPHPSRC}" ];then        echo "KUSANAGIPHPSRC=       ${KUSANAGIPHPSRC}       "; fi
if [ -n "${ARCHIVE_IMAGE_PHP}" ];then     echo "ARCHIVE_IMAGE_PHP=    ${ARCHIVE_IMAGE_PHP}    "; fi
if [ -n "${ARCHIVE_VOLUME_PHP}" ];then    echo "ARCHIVE_VOLUME_PHP=   ${ARCHIVE_VOLUME_PHP}   "; fi
if [ -n "${ARCHIVE_VOLUME_DB}" ];then     echo "ARCHIVE_VOLUME_DB=    ${ARCHIVE_VOLUME_DB}    "; fi
if [ -n "${RESTOREFROMDOCKERFILE}" ];then echo "RESTOREFROMDOCKERFILE=${RESTOREFROMDOCKERFILE}"; fi
if [ -n "${MAKEDOCKERBACKUP}" ];then      echo "MAKEDOCKERBACKUP=     ${MAKEDOCKERBACKUP}     "; fi
if [ -n "${APPDEPLOY_SCRIPT}" ];then      echo "APPDEPLOY_SCRIPT=     ${APPDEPLOY_SCRIPT}     "; fi
if [ -n "${MYSQLFILE}" ];then             echo "MYSQLFILE=            ${MYSQLFILE}            "; fi
if [ -n "${SOURCECODE_ZIPFILE}" ];then    echo "SOURCECODE_ZIPFILE=   ${SOURCECODE_ZIPFILE}   "; fi
if [ -n "${SOURCECODE_DIRNAME}" ];then    echo "SOURCECODE_DIRNAME=   ${SOURCECODE_DIRNAME}   "; fi
if [ -n "${MYSQLFILE}" ];then             echo "MYSQLFILE=            ${MYSQLFILE}            "; fi
if [ -n "${SOURCECODE_PLUGINS}" ];then    echo "SOURCECODE_PLUGINS=   ${SOURCECODE_PLUGINS}   "; fi
if [ -n "${SOURCECODE_UPLOADS}" ];then    echo "SOURCECODE_UPLOADS=   ${SOURCECODE_UPLOADS}   "; fi
if [ -n "${SOURCECODE_THEMES}" ];then     echo "SOURCECODE_THEMES=    ${SOURCECODE_THEMES}    "; fi
if [ -n "${DB_PROTCOL}" ];then            echo "DB_PROTCOL=           ${DB_PROTCOL}           "; fi
if [ -n "${DB_FQDN}" ];then               echo "DB_FQDN=              ${DB_FQDN}              "; fi

if [ -n "${debugmode}" ];then
echo "デバッグモードで実行します"
echo "debugmode=${debugmode}"
fi

Maintennce

UPDATE TOYO DEV SOURCE CODE FROM SAZAE DEPOSITORY

  1. Download archive source code (zip) from bitbucet.
  2. Created work directory on WSL (Ubuntu 20.4)
  3. Unzip files
  4. Rename folder name:
    run this command: move xxx-lms-xxxxxx xxx-lms-devdemo
  5. Update composer.lock in archive folder as below:
    (before) https://github.com/fronteed/icheck/archive/1.0.2.zip
    (after) https://github.com/fronteed/icheck/archive/1.0.1.zip

    Run this command: sed -i "s/https:\/\/github.com\/fronteed\/icheck\/archive\/1.0.2.zip/https:\/\/github.com\/fronteed\/icheck\/archive\/1.0.1.zip/" ./composer.lock
  6. Make zip files:
    Run this command: zip -r xxx-lms-devdemo-ddmmyyyy xxx-lms-devdemo/
  7. Move this file to archives folder
  8. Update buildnewdocker.conf:
    update SOURCECODE_ZIPFILExxx-lms-devdemo-ddmmyyyy.zip in toyo-dev section

REFERENCE

Manual steps to create local env

  1. Create LAMP env
  2. Install Drupal
  3. Install Drush command
  4. Download source code from bitbucet.
  5. Expand under documentroot (actually document root is web folder?)
  6. execute “composer install”* under the folder where composer file exists
    *This command automatically install drupal modules which custom module need
  7. import sql data into mysql database with mysql/drush command

Kusanagi RoD

PHP/Javascript/WORDPRESS案件全般承ります

オーストラリアで主に日系企業や個人のお客様からのご依頼でお仕事をしております。この記事についてのご質問またはお困りのことがございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました