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