Dockerの起動スクリプト書いて動かしてみた!
根強い人気を今でも誇っているShellscriptを使用して
Dockerを動かそうと思ったんだ。
そう。
・・と思ったらうごかなかった!!
ソースは記事下にあります。助けてください
動きました・・・(´・ω・`)(2016/07/03)
さらに修正しました・・(´・ω・`)(2016/07/05)
経緯
- 毎度
docker-machine start マシン名
+eval $(docker-machine env マシン名)
って打つのがめんどくさかった - Shellscriptを覚えたかった
- ShellScriptを覚えたかった(大事なことなので2回ry
linuxは好きですと豪語しながら、シェルスクリプトを書けない、読めない
のはどうなのかと思ったのが一番の出発点です
実行環境
どれぐらいの差があるかわかりませんが、windowsしか想定していません。
検証用でmac実機とかほしいな。
機能
- dockerマシンの起動と停止を簡略化
- 環境変数セットしてくれる
- マシン情報を簡略化
その他いっぱい(希望)
ええ。
難しいですね、理想とは裏腹に実際の実装が見苦しいものになっております。
完成とはほど遠いですが、早めの段階でフィードバックとか見てもらうことって大事なんだと私は思ってます。
分からないなりに進めて、完成させるのも大事ですけど。
途中とちゅうでfeedbackもらったり助けを乞う、意見を聞いたほうが結果的にいいものが出来る・・・はず!(作文かこれ
反省と感想
やっぱり自分で構造を考えて作り上げるのは楽しい。頭痛い場面が多いですけど。
マツケンはこれを書きあげるのに2日?ぐらい気持ちかかりました。
シェルとサブシェルの間に変数の値がうまく渡されないとか。
変数展開、配列がよくわからないとか。いろいろ悩んだ気がします。
おかげさまで知識が広がった気がします。
ソース
一応 github にいい具合に晒しました。
★注意点★
起動する際は. dockrun.sh
かsource 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.sh
か source dockrun.sh
で読み込ませるしかなかったぽい。bashrc
を更新したときにsource
コマンドで再読み込みするよねを思い出した。
その他
起動の際に .
か source
を使わない方法
- ソース内で
#DOCKER_MACHINE=./docker-machine.exe
されているコメントを外し docker-machine
をすべて"${DOCKER_MACHINE}"
に置換- 53行目は
${DOCKER_MACHINE}
の形で置換(クオーテーションなし) - dockrun.shをdocker-machine.exeのあるフォルダに配置
上記方法で起動の際に. や source
を打たなくても問題ないです
発見したのはいいけど、原理がわかりません。
わかるようなわからないような。
しかし汚いソース。もう汚物レベル。
イケてないし、ばいやーソースだけども満足している私がいる。
このブログのレイアウトだとソース見づらいっすよね。(笑)