Skip to content

Instantly share code, notes, and snippets.

@masuidrive
Last active December 24, 2024 05:34
Show Gist options
  • Save masuidrive/76849b7591a77d650286a3910a166245 to your computer and use it in GitHub Desktop.
Save masuidrive/76849b7591a77d650286a3910a166245 to your computer and use it in GitHub Desktop.
dockerのcontainerで起動管理するxbar plugin
#!/bin/bash
# <xbar.title>Docker Manager</xbar.title>
# <xbar.version>v2.4</xbar.version>
# <xbar.author>Yuichiro Masui</xbar.author>
# <xbar.author.github>masuidrive</xbar.author.github>
# <xbar.desc>Manage Docker containers: start, stop, and open services in browser. Manage Colima.</xbar.desc>
# <xbar.dependencies>docker,colima</xbar.dependencies>
# 管理するコンテナのリストを定義
# 各コンテナの設定は "コンテナ名|イメージ名|ポートマッピング|ボリュームマッピング" の形式
# ポートマッピングとボリュームマッピングはカンマ区切りで複数指定可能
# 例:
# "web-app|nginx:latest|8080:80,8443:443|web-data:/usr/share/nginx/html,logs:/var/log/nginx"
CONTAINERS=(
"open-webui|ghcr.io/open-webui/open-webui:main|3000:8080|open-webui:/app/backend/data"
"another-container|your-docker-image:tag|4000:80|another-data:/data"
"web-app|nginx:latest|8080:80,8443:443|web-data:/usr/share/nginx/html,logs:/var/log/nginx"
"database|mysql:5.7|3306:3306|db-data:/var/lib/mysql"
# 追加のコンテナをここに記述
)
# PATH設定(Homebrewのバイナリディレクトリを追加)
# Dockerが正しく動作するために必要なパスを追加
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
# Dockerのフルパスを指定
DOCKER_PATH=$(which docker)
# Colimaのフルパスを指定
COLIMA_PATH=$(which colima)
# プラグインファイルのフルパスを取得
PLUGIN_PATH="$(cd "$(dirname "$0")"; pwd)/$(basename "$0")"
# -----------------------------
# 関数定義
# -----------------------------
# Dockerがインストールされているか確認
function check_docker_installed() {
if [[ -z "$DOCKER_PATH" ]]; then
return 1
else
return 0
fi
}
# Dockerが起動しているか確認
function check_docker_running() {
"$DOCKER_PATH" info > /dev/null 2>&1
return $?
}
# Colimaがインストールされているか確認
function check_colima_installed() {
if [[ -z "$COLIMA_PATH" ]]; then
return 1
else
return 0
fi
}
# Colimaが起動しているか確認
function check_colima_running() {
if [[ -x "$COLIMA_PATH" ]]; then
COLIMA_STATUS=$("$COLIMA_PATH" status 2>&1)
if [[ "$COLIMA_STATUS" == *"running"* ]]; then
return 0
else
return 1
fi
else
return 1
fi
}
# Docker Desktopを開く関数
function open_docker_desktop() {
open -a Docker
}
# プラグインファイルのフルパスをクリップボードにコピー
function copy_plugin_path() {
echo "$PLUGIN_PATH" | pbcopy
osascript -e 'display notification "Plugin path copied to clipboard." with title "Docker Manager"'
}
# Colimaを起動する関数
function start_colima() {
if [[ -x "$COLIMA_PATH" ]]; then
"$COLIMA_PATH" start
osascript -e 'display notification "Colima started successfully." with title "Docker Manager"'
else
osascript -e 'display notification "Colima is not installed." with title "Docker Manager"'
fi
}
# Colimaを停止する関数
function stop_colima() {
if [[ -x "$COLIMA_PATH" ]]; then
"$COLIMA_PATH" stop
osascript -e 'display notification "Colima stopped successfully." with title "Docker Manager"'
else
osascript -e 'display notification "Colima is not installed." with title "Docker Manager"'
fi
}
# -----------------------------
# アクション実行部分
# -----------------------------
if [[ $# -ge 1 ]]; then
ACTION="$1"
PARAM="$2"
case "$ACTION" in
start)
CONTAINER_NAME="$PARAM"
# コンテナの設定を取得
CONTAINER_CONFIG=""
for container in "${CONTAINERS[@]}"; do
IFS='|' read -r name image ports volumes <<< "$container"
if [[ "$name" == "$CONTAINER_NAME" ]]; then
CONTAINER_CONFIG="$container"
break
fi
done
if [[ -z "$CONTAINER_CONFIG" ]]; then
echo "Invalid container name: $CONTAINER_NAME | color=red"
exit 1
fi
IFS='|' read -r name image ports volumes <<< "$CONTAINER_CONFIG"
# コンテナが存在するか確認
if "$DOCKER_PATH" ps -a --format "{{.Names}}" | grep -w "$name" > /dev/null 2>&1; then
# コンテナが存在する場合、起動
if "$DOCKER_PATH" start "$name" >/dev/null 2>&1; then
osascript -e 'display notification "Container '"$name"' started successfully." with title "Docker Manager"'
else
osascript -e 'display notification "Failed to start container '"$name"'." with title "Docker Manager"'
fi
else
# コンテナが存在しない場合、インストール(起動)
if [[ -z "$image" ]]; then
osascript -e 'display notification "No image specified for '"$name"'." with title "Docker Manager"'
exit 1
fi
# ポートマッピングが複数ある場合に対応
IFS=',' read -ra PORT_ARRAY <<< "$ports"
PORT_OPTIONS=""
for port in "${PORT_ARRAY[@]}"; do
PORT_OPTIONS="$PORT_OPTIONS -p $port"
done
# ボリュームマッピングが複数ある場合に対応
IFS=',' read -ra VOLUME_ARRAY <<< "$volumes"
VOLUME_OPTIONS=""
for volume in "${VOLUME_ARRAY[@]}"; do
VOLUME_OPTIONS="$VOLUME_OPTIONS -v $volume"
done
if "$DOCKER_PATH" run -d $PORT_OPTIONS --add-host=host.docker.internal:host-gateway \
$VOLUME_OPTIONS --name "$name" "$image" >/dev/null 2>&1; then
osascript -e 'display notification "Container '"$name"' installed and started successfully." with title "Docker Manager"'
else
osascript -e 'display notification "Failed to install container '"$name"'." with title "Docker Manager"'
fi
fi
;;
stop)
CONTAINER_NAME="$PARAM"
# コンテナの設定を取得
CONTAINER_CONFIG=""
for container in "${CONTAINERS[@]}"; do
IFS='|' read -r name image ports volumes <<< "$container"
if [[ "$name" == "$CONTAINER_NAME" ]]; then
CONTAINER_CONFIG="$container"
break
fi
done
if [[ -z "$CONTAINER_CONFIG" ]]; then
echo "Invalid container name: $CONTAINER_NAME | color=red"
exit 1
fi
IFS='|' read -r name image ports volumes <<< "$CONTAINER_CONFIG"
if "$DOCKER_PATH" stop "$name" >/dev/null 2>&1; then
osascript -e 'display notification "Container '"$name"' stopped successfully." with title "Docker Manager"'
else
osascript -e 'display notification "Failed to stop container '"$name"'." with title "Docker Manager"'
fi
;;
open)
URL="$PARAM"
open "$URL"
;;
copy_path)
copy_plugin_path
;;
open_docker_desktop)
open_docker_desktop
osascript -e 'display notification "Docker Desktop is opening." with title "Docker Manager"'
;;
start_colima)
start_colima
;;
stop_colima)
stop_colima
;;
*)
;;
esac
# アクション後、プラグインをリフレッシュ
exit 0
fi
# -----------------------------
# メニューバー表示部分
# -----------------------------
# メイン表示用の文字列を初期化
MENU_TEXT="🐳"
# Dockerがインストールされていない場合
if ! check_docker_installed; then
echo "$MENU_TEXT | color=red"
echo '---'
echo "Please install Docker or edit the plugin file's PATH."
echo "Open Docker Desktop | bash='$0' param1=open_docker_desktop terminal=false refresh=true"
echo "Start Colima | bash='$0' param1=start_colima terminal=false refresh=true"
echo "Copy Plugin file path | bash='$0' param1=copy_path terminal=false refresh=true"
exit 0
fi
# Dockerがインストールされているが起動していない場合
if ! check_docker_running; then
echo "$MENU_TEXT | color=orange"
echo '---'
echo "Docker is not running."
echo "Open Docker Desktop | bash='$0' param1=open_docker_desktop terminal=false refresh=true"
echo "Start Colima | bash='$0' param1=start_colima terminal=false refresh=true"
exit 0
fi
# Dockerがインストールされていて起動している場合
echo "$MENU_TEXT"
echo '---'
# 各コンテナの状態を表示
for container in "${CONTAINERS[@]}"; do
IFS='|' read -r name image ports volumes <<< "$container"
STATUS=$("$DOCKER_PATH" ps -a --filter "name=^/${name}$" --format "{{.Status}}")
if [[ -z "$STATUS" ]]; then
DISPLAY_STATUS="Not Installed"
elif [[ "$STATUS" == *"Up"* ]]; then
DISPLAY_STATUS="🟢 Running"
else
DISPLAY_STATUS="⏸️ Stopped"
fi
# コンテナ名と状態を表示
echo "$name: $DISPLAY_STATUS"
# アクションメニュー
if [[ "$DISPLAY_STATUS" == "🟢 Running" ]]; then
echo " Stop $name | bash='$0' param1=stop param2=$name terminal=false refresh=true"
# ポートマッピングを解析して「Open」メニューアイテムを追加
IFS=',' read -ra PORT_ARRAY <<< "$ports"
for port in "${PORT_ARRAY[@]}"; do
HOST_PORT=${port%%:*} # host_portを取得
# HTTPプロトコルを前提としています。必要に応じて変更してください。
URL="http://localhost:$HOST_PORT"
echo " Open http://localhost:$HOST_PORT | bash='$0' param1=open param2=$URL terminal=false refresh=true"
done
else
echo " Start $name | bash='$0' param1=start param2=$name terminal=false refresh=true"
fi
echo "---"
done
# Colimaがインストールされていて実行中の場合、メニューの最下部に「Stop Colima」を追加
if check_colima_installed && check_colima_running; then
echo "Colima Management | font=bold"
echo " Stop Colima | bash='$0' param1=stop_colima terminal=false refresh=true"
echo "---"
fi
# ## **アプリケーションの概要とドキュメント**
#
# ### **1. アプリケーションの概要**
#
# Docker Managerは、macOSのメニューバーから直接Dockerコンテナを管理できる便利なxbarプラグインです。以下の機能を提供します:
#
# - **コンテナ管理:**
# - コンテナの起動 (`Start`)
# - コンテナの停止 (`Stop`)
# - コンテナが公開しているサービスへのアクセス (`Open`)
#
# - **Colimaの管理:**
# - Colimaの起動 (`Start Colima`)
# - Colimaの停止 (`Stop Colima`)
#
# - **便利な機能:**
# - プラグインファイルのフルパスをクリップボードにコピー (`Copy Plugin Path`)
# - Docker Desktopの起動 (`Open Docker Desktop`)
# - 操作結果のmacOS通知
#
# ### **2. セットアップ方法**
#
# #### **a. スクリプトの配置と実行権限の確認**
#
# 1. **スクリプトを作成:**
# - 上記のスクリプトをテキストエディタにコピーし、`docker-manager.1m.sh` という名前で保存します。
#
# 2. **スクリプトに実行権限を付与:**
# ```bash
# chmod +x docker-manager.1m.sh
# ```
#
# 3. **スクリプトをxbarのプラグインフォルダに配置:**
# ```bash
# mv docker-manager.1m.sh ~/Library/Application\ Support/xbar/plugins/
# ```
#
# 4. **xbarをリロード:**
# - メニューバーのxbarアイコンをクリックし、「Refresh All」を選択してプラグインを読み込み直します。
#
# #### **b. DockerとColimaのインストール**
#
# - **Dockerのインストール:**
# - [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) を公式サイトからダウンロードしてインストールしてください。
#
# - **Colimaのインストール(オプション):**
# - Homebrewを使用してColimaをインストールします:
# ```bash
# brew install colima
# ```
#
# ### **3. 使用方法**
#
# #### **a. メニューバー表示**
#
# - メニューバーに「🐳 Docker Manager」と表示されます。クリックすると、以下の内容が表示されます。
#
# #### **b. Dockerがインストールされていない場合**
#
# - **表示内容:**
# - メインアイコンが赤色で表示されます。
# - メニューに以下の項目が表示されます:
# - 「Please install Docker or edit the plugin file's PATH.」
# - 「Open Docker Desktop」ボタン:Docker Desktopを開きます。
# - 「Start Colima」ボタン:Colimaを起動します。
# - 「Copy Plugin Path」ボタン:プラグインファイルのフルパスをクリップボードにコピーします。
#
# #### **c. Dockerがインストールされているが起動していない場合**
#
# - **表示内容:**
# - メインアイコンがオレンジ色で表示されます。
# - メニューに以下の項目が表示されます:
# - 「Docker is not running.」
# - 「Open Docker Desktop」ボタン:Docker Desktopを開きます。
# - 「Start Colima」ボタン:Colimaを起動します。
# - 「Copy Plugin Path」ボタン:プラグインファイルのフルパスをクリップボードにコピーします。
#
# #### **d. Dockerがインストールされていて起動している場合**
#
# - **表示内容:**
# - メインアイコンが通常の色で表示されます。
# - 管理対象の各コンテナの状態が以下のように表示されます:
# - **🟢 Running:** コンテナが稼働中
# - 「Stop」ボタン:コンテナを停止します。
# - 「Open http://localhost:ホストポート」ボタン:対応するサービスをブラウザで開きます。
# - **⏸️ Stopped:** コンテナが停止中
# - 「Start」ボタン:コンテナを起動します。
# - **🛠️ Not Installed:** コンテナが未インストール
# - 「Start」ボタン:コンテナを起動(未インストールの場合は自動的にインストールされます)。
#
# - **Colimaが実行中の場合:**
# - メニューの最下部に「Colima Management」が太字で表示されます。
# - 「Stop Colima」ボタン:Colimaを停止します。
#
# #### **e. 操作後の通知**
#
# - 操作(Start、Stop、Open、ColimaのStart/Stop)後に、macOSの通知センターに結果が表示されます。
#
# ### **4. コンテナ設定方法**
#
# #### **a. `CONTAINERS`配列の設定**
#
# - **場所:**
# スクリプトの最初の部分にある`CONTAINERS`配列で管理します。
#
# - **形式:**
# ```
# "コンテナ名|イメージ名|ポートマッピング|ボリュームマッピング"
# ```
#
# - **ポートマッピング:**
# - `ホストポート:コンテナポート` の形式。
# - 複数指定する場合はカンマで区切ります。
# - **例:**
# - 単一ポート: `8080:80`
# - 複数ポート: `8080:80,8443:443`
#
# - **ボリュームマッピング:**
# - `ホストパス:コンテナパス` の形式。
# - 複数指定する場合はカンマで区切ります。
# - **例:**
# - 単一ボリューム: `web-data:/usr/share/nginx/html`
# - 複数ボリューム: `web-data:/usr/share/nginx/html,logs:/var/log/nginx`
#
# - **設定例:**
# ```bash
# CONTAINERS=(
# "open-webui|ghcr.io/open-webui/open-webui:main|3000:8080|open-webui:/app/backend/data"
# "another-container|your-docker-image:tag|4000:80|another-data:/data"
# "web-app|nginx:latest|8080:80,8443:443|web-data:/usr/share/nginx/html,logs:/var/log/nginx"
# "database|mysql:5.7|3306:3306|db-data:/var/lib/mysql"
# "new-container|dockerhub-username/image:tag|5000:5000|new-data:/new/path"
# )
# ```
#
# #### **b. コンテナの追加・編集**
#
# 1. **新しいコンテナを追加:**
# - `CONTAINERS`配列に新しいエントリを追加します。
# - **例:**
# ```bash
# "new-container|dockerhub-username/image:tag|5000:5000|new-data:/new/path"
# ```
#
# 2. **既存のコンテナを編集:**
# - 必要に応じて、コンテナ名、イメージ名、ポートマッピング、ボリュームマッピングを編集します。
# - **例:**
# ```bash
# "web-app|nginx:latest|4000:80,8443:443|web-data:/usr/share/nginx/html,logs:/var/log/nginx"
# ```
#
# ### **5. PATH設定の詳細**
#
# スクリプトの`PATH`設定部分では、DockerおよびColimaが正しく動作するために必要なパスを含めています。
#
# ```bash
# export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
# ```
#
# - **解説:**
# - `/opt/homebrew/bin`:Homebrewのバイナリディレクトリ(Apple Siliconの場合)。
# - `/usr/local/bin`:Homebrewのバイナリディレクトリ(Intelの場合)。
# - `/usr/bin`、`/bin`、`/usr/sbin`、`/sbin`:システムの標準バイナリディレクトリ。
# - `$PATH`:既存の`PATH`環境変数を保持。
#
# - **必要に応じて追加:**
# - 特定の場所にインストールされているDockerやColimaのパスがある場合は、適宜追加してください。
# - **例:**
# ```bash
# export PATH="/opt/homebrew/bin:/usr/local/bin:/custom/path/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
# ```
#
# ### **6. トラブルシューティングと注意点**
#
# 1. **スクリプトが動作しない場合:**
# - スクリプトに実行権限が付与されているか確認してください。
# ```bash
# chmod +x docker-manager.1m.sh
# ```
# - 必要な依存関係(Docker、Colima)がインストールされているか確認してください。
#
# 2. **DockerやColimaのパスが正しくない場合:**
# - スクリプト内の`DOCKER_PATH`や`COLIMA_PATH`が正しく設定されているか確認してください。
# - 手動でパスを設定する場合は、スクリプト内で直接指定できます。
# ```bash
# DOCKER_PATH="/usr/local/bin/docker"
# COLIMA_PATH="/usr/local/bin/colima"
# ```
#
# 3. **複数のポートやボリュームを設定しても反映されない場合:**
# - `CONTAINERS`配列内のポートマッピングやボリュームマッピングが正しくカンマ区切りで指定されているか確認してください。
# - スクリプト内の解析部分が正しく動作しているか確認してください。
#
# 4. **通知が表示されない場合:**
# - `osascript`が正しく動作しているか確認してください。
# - macOSの通知設定でスクリプトが通知を送信できるように許可されているか確認してください。
#
# ### **7. 追加のカスタマイズ**
#
# #### **a. プロトコルの変更**
#
# 現在、スクリプトはHTTPプロトコルを前提としています。HTTPSや他のプロトコルを使用する場合は、URL生成部分をカスタマイズしてください。
#
# - **例: HTTPSに変更**
# ```bash
# PROTOCOL="https"
#
# # URL生成時に使用
# URL="$PROTOCOL://localhost:$HOST_PORT"
# ```
#
# #### **b. デフォルトURLの設定**
#
# 特定のコンテナに対してデフォルトのURLを設定したい場合、`CONTAINERS`配列にURLを追加し、スクリプトを拡張します。
#
# - **例:**
# ```bash
# CONTAINERS=(
# "web-app|nginx:latest|8080:80,8443:443|web-data:/usr/share/nginx/html,logs:/var/log/nginx|https://localhost:8443"
# # その他のコンテナ
# )
# ```
@masuidrive
Copy link
Author

Screenshot 2024-12-24 at 14 07 48

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment