Vagrantから脱出せよ!!Docker化 Go!!Go!!(3)
ローカルのDocker環境の完成について
なかなか完了しておりませんでしたが、Intelチップ搭載のMacOSを入手が困難😵💫で急いで急いで完成させました。
ここでは、完成するまでの問題内容をまとめたいと思います。
DBのイメージについて
構築と問題
当初、IntelとApple Siliconチップの両方で同じdocker-compose.xml
(イメージ)を使用することを目指し、mysql/mysql-server
を利用する予定でした。しかし、mysql/mysql-server
の8.0.28
タグはamd64にしか対応していないことが分かりました。
解決
そのため、8.0.28-1.2.7-server
イメージを使用することにしました。このバージョンのイメージは両方のチップで利用可能でした。
mutagen projectの使用について
構築と問題
上記の記事を参考にmutagen project
を構築しましたが、問題がありました。mutagen.yml
のaplpha
パスは絶対パスでなければならず、開発者ごとにパスが異なるため、「~/xxxx」のような使い方ができませんでした。
構成時に必要な設定は.env
にまとめ、docker-compose
から参照できるようになりましたが、mutagen.yml
にはその方法がありませんでした。
解決
mutagen.yml
ファイルのテンプレートを作成し、特定の文字を.env
の値に置換する方法で解決しました。
以下のファイルが同じフォルダにある状態です。
- .env
- docker-compose.yml
- mutagen.yml.tpl
- mutagen_start.sh
作成したmutagen_start.sh
ファイルの内容は以下の通りです。
#!/bin/bash
# Specify the path to your .env file
ENV_FILE=".env"
# Register shutdown handler
function gracefulShutdown ()
{
mutagen project terminate
# docker-compose down --remove-orphans || true
docker-compose stop || true
exit 2
}
# Check if the .env file exists
if [ -f "$ENV_FILE" ]; then
echo "[INFO]: Reading $ENV_FILE file."
# Read the .env file line by line
while IFS= read -r line; do
# Skip comments and empty lines
if [[ "$line" =~ ^\s*#.*$ || -z "$line" ]]; then
continue
fi
# Split the line into key and value
key=$(echo "$line" | cut -d '=' -f 1)
value=$(echo "$line" | cut -d '=' -f 2-)
# Remove single quotes, double quotes, and leading/trailing spaces from the value
value=$(echo "$value" | sed -e "s/^'//" -e "s/'$//" -e 's/^"//' -e 's/"$//' -e 's/^[ \t]*//;s/[ \t]*$//')
# Export the key and value as environment variables
export "$key=$value"
done < "$ENV_FILE"
echo "[DONE]: Reading $ENV_FILE file."
trap "gracefulShutdown" 2
# ホストのIPを環境変数へ格納
export PUBLIC_IP_OF_HOST=`ifconfig $NET_INTERFACE_ID | grep inet | grep -v inet6 | sed -E "s/inet ([0-9]{1,3}.[0-9]{1,3}.[0-9].{1,3}.[0-9]{1,3}) .*$/\1/" | tr -d "\t"`
echo "PUBLIC_IP_OF_HOST=${PUBLIC_IP_OF_HOST}"
# mutagen.ymlを作成
envsubst '\${PROJECT_PATH_OF_HOST},\${NET_INTERFACE_ID},\${DEFAULT_DOMAIN},\${DEFAULT_ENROLLMENT_DOMAIN},\${BUNDLE_GITHUB__COM}' < ./mutagen.yml.tpl > ./mutagen.yml
# Start file sync
mutagen project start || mutagen project terminate
mutagen project run logs
else
echo "[ERROR]: $ENV_FILE not found."
fi
リソースの配分について
構築と問題
当初はdocker-compose.yml
には特定の制限を設定せず、Docker Desktop For Mac
のリソース設定のみを行い、Docker Desktopに管理を任せる予定でした。
この場合Docker Desktopのバージョンによる可能性も否定出来ないですが、1つのコンテナが設定しているメモリ等を全て使用するとDocker Desktop
自体が重くなり、他のコンテナがフリーズすることがありました。
解決
docker-compose.yml
の中にリソースの制限を追記し、Docker Desktop
のリソース設定を超えないようにしました。
deploy:
resources:
limits:
memory: '5G'
cpus: '3'
M1ではlinksが効かない
docker-compose.yml
の中にlinks
で定義したコンテナ名は、定義されたコンテナ内部でホスト名として使用可能でしたが、うまく動かない場合がありました。今回は必要に応じて/etc/hosts
に設定を追記する方法で対応しました。
Discussion