読者です 読者をやめる 読者になる 読者になる

This is a Pen

プログラミングとITと日記

Dockerの起動スクリプト書いて動かしてみた!

根強い人気を今でも誇っているShellscriptを使用して
Dockerを動かそうと思ったんだ。

そう。

f:id:pierrot-nose:20160706115119g:plain

・・と思ったらうごかなかった!!
ソースは記事下にあります。助けてください






動きました・・・(´・ω・`)(2016/07/03)

さらに修正しました・・(´・ω・`)(2016/07/05)

経緯

  • 毎度 docker-machine start マシン名 + eval $(docker-machine env マシン名)って打つのがめんどくさかった
  • Shellscriptを覚えたかった
  • ShellScriptを覚えたかった(大事なことなので2回ry

linuxは好きですと豪語しながら、シェルスクリプトを書けない、読めない
のはどうなのかと思ったのが一番の出発点です

実行環境

  • docker toolbox 1.12rc
  • windows10
  • git for windows 2.9 ( Bashは確か4系です )

どれぐらいの差があるかわかりませんが、windowsしか想定していません。
検証用でmac実機とかほしいな。

機能

  • dockerマシンの起動と停止を簡略化
  • 環境変数セットしてくれる
  • マシン情報を簡略化
  • その他いっぱい(希望)

ええ。
難しいですね、理想とは裏腹に実際の実装が見苦しいものになっております。


完成とはほど遠いですが、早めの段階でフィードバックとか見てもらうことって大事なんだと私は思ってます。

分からないなりに進めて、完成させるのも大事ですけど。
途中とちゅうでfeedbackもらったり助けを乞う、意見を聞いたほうが結果的にいいものが出来る・・・はず!(作文かこれ

反省と感想

やっぱり自分で構造を考えて作り上げるのは楽しい。頭痛い場面が多いですけど。
マツケンはこれを書きあげるのに2日?ぐらい気持ちかかりました。


シェルとサブシェルの間に変数の値がうまく渡されないとか。
変数展開、配列がよくわからないとか。いろいろ悩んだ気がします。
おかげさまで知識が広がった気がします。

ソース

一応 github にいい具合に晒しました。 

★注意点★

起動する際は. dockrun.shsource dockrun.shで実行しないと環境変数が設定してくれません。

#!/bin/bash
#
# SCRIPT: dockrun.shell
# AUTHOR: hoihoihoihoihoi/matsuken
# DATE: 2016-07-05
# PLATFORM: Windows10, git for windows, docker-toolbox,virtualbox
#
# PURPOSE: This Script is for  Windows and DockerToolbox users ( via virtualbox and git for windows )
#          it will gonna run/stop your docker-machines and sets your ENVs
# 
# USAGE - you should use ".(dot)" or "source" commands when you use it.
#         example: ". dockrun.sh" "source dockrun.sh"
# 
#       - simply type down the number of the machine from the list.
#         then it will gonna start/stop automatically and set up your environment variables.

# Variables 
MACHINE_LIST=()
declare -A MACHINE_STATE
VM_NUM=1;
MACHINE_RUN=0
#DOCKER_MACHINE=./docker-machine.exe

# remove the list of VMs on the end
trap 'rm -rf mktemp.txt; exit 1' 0 1 2 3 15

#2 get the machine-name from the tmpfile
getNameState () {
    while read LINE
        do
            #2-1 putting VMs name into array
            MACHINE_LIST+=("`echo $LINE | awk '{print $1}'`")
        done < $1
    #2-2 loop the MACHINE_LIST to get machine's State
    for machine_name in ${MACHINE_LIST[@]}
        do
            MACHINE_STATE["${machine_name}"]="$( grep ${machine_name} $1 | awk '{print $4}')"
        done
}

#3 start and stop the docker-machine
machineRun () {
    read ans;
    INDEX=$(($ans - 1)) 
    if [ "$ans" -gt 0 ];then
        # Stop/Runs the VM after checking its State
        if [ "${MACHINE_STATE[${MACHINE_LIST[${INDEX}]}]}" =  "Running" ];then
           docker-machine stop ${MACHINE_LIST[${INDEX}]}
        else
            docker-machine start ${MACHINE_LIST[${INDEX}]};
            echo "<----- regenerating machine certificate ----->"
            yes | docker-machine regenerate-certs "${MACHINE_LIST[${INDEX}]}"
            eval "$(docker-machine env --shell=bash ${MACHINE_LIST["${INDEX}"]})"
            MACHINE_RUN=1
        fi
    elif [ $ans -eq 0 ];then
        # im gonna add some features here later.
       exit;
    fi
}

#4 export


# Start
echo "<-------- checking your machine list -------->"

#1 making tmpfile from/by executing docker-machine ls
for machine_list in `docker-machine ls | grep virtualbox |& tee mktemp.txt | 
awk '{
    $8=" "; print "\033[1;32m" $1 "\033[0m" $8 "is" $8 "\033[1;31m" $4 "\033[0m ";
}'`
do
    echo -e "    ${VM_NUM}: ${machine_list}" 
    VM_NUM=$((VM_NUM+1))
done
echo "<-- enter the machine number from the list -->"

# function 2,3 & 4 for export
getNameState mktemp.txt
machineRun

if [ ${MACHINE_RUN} -eq 1 ];then
clear
cat << EOF

     _____          ___           ___           ___           ___           ___     
    /  /::\        /  /\         /  /\         /__/|         /  /\         /  /\    
   /  /:/\:\      /  /::\       /  /:/        |  |:|        /  /:/_       /  /::\   
  /  /:/  \:\    /  /:/\:\     /  /:/         |  |:|       /  /:/ /\     /  /:/\:\  
 /__/:/ \__\:|  /  /:/  \:\   /  /:/  ___   __|  |:|      /  /:/ /:/_   /  /:/~/:/  
 \  \:\ /  /:/ /__/:/ \__\:\ /__/:/  /  /\ /__/\_|:|____ /__/:/ /:/ /\ /__/:/ /:/___
  \  \:\  /:/  \  \:\ /  /:/ \  \:\ /  /:/ \  \:\/:::::/ \  \:\/:/ /:/ \  \:\/:::::/
   \  \:\/:/    \  \:\  /:/   \  \:\  /:/   \  \::/~~~~   \  \::/ /:/   \  \::/~~~~ 
    \  \::/      \  \:\/:/     \  \:\/:/     \  \:\        \  \:\/:/     \  \:\     
     \__\/        \  \::/       \  \::/       \  \:\        \  \::/       \  \:\    
                   \__\/         \__\/         \__\/         \__\/         \__\/    
--------------------------------------------------------------------------------------
                            BUILD, SHIP, RUN

EOF
fi

# End

詰まった点

変数展開:変数の中に変数をつかったり、変数名を値として使おうとしていっぱい詰まった。
結果的にはよかったんだけど、はじめて書くのに変な事ばかりやろうとしてたのがいけなかったのかな
基本って大事。

シェル、サブシェルシェルスクリプトを書いていくと、実行しているシェル(親)が別のシェル(子)を読んだりするのですが、ここらへんの値の行き来を理解するのに時間がかかってしまった。

シェル内からの環境変数設定:わからん。export -fとかMSYS_PATH_CONVとかじゃ解決できなかったぽい。使うときに . dockrun.shsource dockrun.sh で読み込ませるしかなかったぽい。bashrcを更新したときにsourceコマンドで再読み込みするよねを思い出した。


その他

起動の際に .sourceを使わない方法

  • ソース内で#DOCKER_MACHINE=./docker-machine.exeされているコメントを外し
  • docker-machineをすべて"${DOCKER_MACHINE}"に置換
  • 53行目は${DOCKER_MACHINE}の形で置換(クオーテーションなし)
  • dockrun.shをdocker-machine.exeのあるフォルダに配置

上記方法で起動の際に. や source を打たなくても問題ないです
発見したのはいいけど、原理がわかりません。
わかるようなわからないような。





しかし汚いソース。もう汚物レベル。
イケてないし、ばいやーソースだけども満足している私がいる。





このブログのレイアウトだとソース見づらいっすよね。(笑)

Related Posts Plugin for WordPress, Blogger...