/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } minikube 起動・終了 – Raqqa

minikube 起動・終了

起動

# 例: 4CPU / 6GB、docker driver
minikube start --driver=docker --container-runtime=containerd \
  --cpus=4 --memory=6g --disk-size=20g

休止(最速の一時停止)

minikube pause          # 全Podを一時停止(数秒)
minikube unpause        # すぐ復帰
  • 超短時間の休憩や、すぐ再開したい時に最適。CPU/メモリ消費がグッと下がります。

停止(安全に止めて、次回すぐ再開)

minikube stop           # ノード/コントロールプレーン停止(状態とPVは保持)
minikube start          # 再開(前回設定を引き継ぐ)
  • 開発を一旦終える時は stop が基本。データ(PV)や設定は残ります。

完全削除(環境まるごと掃除)

# プロファイルを指定(デフォルトなら -p 省略可)
minikube delete -p minikube
  • 全て消えます(クラスタ、コントロールプレーン、作成済みのPV/イメージも原則削除)。
  • まっさらでやり直したい時だけ使うのがおすすめ。

アドオンや周辺プロセスのオフ

# 使っていないアドオンは切って軽量化
minikube addons list
minikube addons disable ingress
minikube addons disable metrics-server

minikube tunnel / minikube mount の終了

  • 実行中ターミナルで Ctrl+C
  • 背景で残ってしまった場合: pkill -f "minikube tunnel" pkill -f "minikube mount"

さらに軽くしたい時(WSL2 ならでは)

  • Docker Engine 自体を止める(minikube stop 後) sudo systemctl stop docker # 再開時 sudo systemctl start docker
  • WSLごとメモリ解放(Windows PowerShell) wsl --shutdown ※ すべての WSL ディストリが終了します。再度Ubuntuを起動して作業再開。

プロファイル運用(複数クラスタを使う場合)

minikube profile list
minikube stop   -p dev
minikube delete -p dev
minikube start  -p dev --driver=docker --cpus=4 --memory=6g

次回起動を軽くするコツ

  • よく使うサイズを事前設定: minikube config set memory 4096 minikube config set cpus 2
  • 使う時だけ Ingress を有効化し、終わったら無効化。

実運用のおすすめフロー

  1. 作業開始 → minikube start …
  2. 短い休憩 → minikube pause(or しっかり終えるなら minikube stop
  3. 再開 → minikube unpause / minikube start
  4. 今日は完全終了 → minikube stop →(必要なら)sudo systemctl stop docker →(さらに解放したければ)Windowsで wsl --shutdown

WSL2 上の Ubuntu に minikube を入れて動かす最短手順です。コマンドは全部「WSL2 の Ubuntu ターミナル」で実行してください。

手順

0) 前提チェック(WSL2 + systemd)

  1. Windows 側 PowerShell: wsl --statusDefault Version: 2 になっていればOK。
  2. Ubuntu 側で systemd を有効化(Docker Engine を楽に動かすため) sudo nano /etc/wsl.conf こんな内容にして保存: [boot] systemd=true その後、Windows PowerShell で: wsl --shutdown → Ubuntu を起動し直す。
    確認: systemctl --version

1) Docker Engine(Desktop ではなく、軽量な本体だけ)

すでに Docker Engine が入っていれば この章はスキップ

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
# 動作確認
docker info

2) kubectl

(minikube 経由で使う方法もありますが、単体で入れておくと便利)

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client

3) minikube 本体

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube version

4) クラスタ起動(Docker driver を使用)

WSL2 では仮想化ドライバより docker ドライバが軽量・安定です。

# CPU/MEM はお好みで(例は 4CPU / 6GB)
minikube start --driver=docker --container-runtime=containerd \
  --cpus=4 --memory=6g --disk-size=20g

確認:

minikube status
kubectl get nodes

5) よく使うアドオン

# メトリクス
minikube addons enable metrics-server
# Ingress(Nginx)
minikube addons enable ingress
  • LoadBalancer を使う場合は、別端末で minikube tunnel を実行(終了するまで前面で動きます)。
  • サービスURL確認:minikube service <svc名> --url

6) 永続ボリュームの注意(ChromaDB 用)

  • minikube(docker driver)はデフォルトで 標準StorageClass を持ち、PersistentVolumeClaim がそのまま使えます(開発中はこれで十分)。
  • hostPath を使うとパスは minikubeノード(=Dockerコンテナ)内になります。WSLのディレクトリを直接使いたい場合は、開発時だけ minikube mount $HOME/data:/mnt/data のようにマウントできます(別端末で起動)。

よくあるハマりどころ

  • docker グループに入っていない → permission denied
    usermod -aG docker $USERnewgrp docker
  • systemd 無効で Docker が起動していない
    /etc/wsl.confsystemd=truewsl --shutdown 後に再起動
  • リソース不足(起動が遅い/失敗)
    minikube start--cpus/--memory を増やす
  • Ingress にアクセスできない
    minikube addons enable ingress 済みか、minikube tunnel を別端末で実行

起動と終了

nohup kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8080:80 \
  > ~/pf_ingress.log 2>&1 & echo $! > ~/.pf_ingress.pid
# 停止
kill $(cat ~/.pf_ingress.pid) 2>/dev/null || pkill -f 'port-forward.*ingress-nginx-controller.*8080:80'


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です