😎

Vagrantから脱出せよ!!Docker化 Go!!Go!!(3)

2024/08/05に公開

ローカルのDocker環境の完成について

なかなか完了しておりませんでしたが、Intelチップ搭載のMacOSを入手が困難😵‍💫で急いで急いで完成させました。

ここでは、完成するまでの問題内容をまとめたいと思います。

DBのイメージについて

構築と問題

当初、IntelとApple Siliconチップの両方で同じdocker-compose.xml(イメージ)を使用することを目指し、mysql/mysql-serverを利用する予定でした。しかし、mysql/mysql-server8.0.28タグはamd64にしか対応していないことが分かりました。

解決

そのため、8.0.28-1.2.7-serverイメージを使用することにしました。このバージョンのイメージは両方のチップで利用可能でした。

https://hub.docker.com/r/mysql/mysql-server/tags?page=&page_size=&ordering=&name=8.0.28

mutagen projectの使用について

構築と問題

https://qiita.com/scribble/items/e614bbd63035b6b758a4

上記の記事を参考にmutagen projectを構築しましたが、問題がありました。mutagen.ymlaplphaパスは絶対パスでなければならず、開発者ごとにパスが異なるため、「~/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に設定を追記する方法で対応しました。

https://qiita.com/ta_nuki/items/7830c6ab6d8b3c4327cc

Inventit Tech

Discussion