Last active
December 24, 2024 05:34
-
-
Save masuidrive/76849b7591a77d650286a3910a166245 to your computer and use it in GitHub Desktop.
dockerのcontainerで起動管理するxbar plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" | |
# # その他のコンテナ | |
# ) | |
# ``` |
Author
masuidrive
commented
Dec 24, 2024

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