Diary

@ssig33

15/Oct/2016 (Sat) 21:44

Docker swarm mode の構成をバックアップする スクリプトを書いた。 Ruby で書かれています。実行すると

docker service create --name=lig -p 30007:26667 imagename
docker service create --name=diary -p 30000:3000 --mount type=bind,source=/source/,target=/target diaryimage:v17
docker service create --name=mariadb -p 30023:3306 --mount type=bind,source=/mariadb,target=/var/lib/mysql --constraint=node.hostname==hostname mariadb:latest

みたいな感じで出力するので、これを保存しておけば一発でクラスタの構成を再現できるという感じ。公式でこういうのほしいけどまあ自作してしまったほうがはやい。 API 使ってないのはこっちのほうが実装楽だったからです。僕が使って困らないようにしか書かれてないのでどこでも動くとは限りません。ポート複数公開してるサービスあったりすると現状滅ぶ。

services = `docker service ls`.split("\n").map{|x| x.split(" ")}.select{|x| x && x != ""}.map{|x| x[1]}.tap{|ary| ary.shift}
services.each{|name|
  j = `docker service inspect --pretty #{name}`
  ary = j.split("\n")
  name = ary.select{|y| y =~ /Name:/}.first.split(" ").last
  image = ary.select{|y| y =~ /Image:/}.first.split(" ").last
  result = "docker service create"
  result += " --name=#{name}"

  if ary.select{|x| x =~ /TargetPort =/}.first
    target = ary.select{|x| x =~ /TargetPort =/}.first.split(" ").last
    publish = ary.select{|x| x =~ /PublishedPort =/}.first.split(" ").last

    result += " -p #{publish}:#{target}"
  end

  if (mount_count = ary.select{|x| x =~ /Target =/}.count) > 0
    mount_count.times{|i|
      target = ary.select{|x| x =~ /Target =/}[i].split(" ").last
      source = ary.select{|x| x =~ /Source =/}[i].split(" ").last
      result += " --mount type=bind,source=#{source},target=#{target}"
    }
  end

  if j =~ /Constraint/
    const = ary.select{|x| x =~ /Constraints/}.first.split(" ").last
    result += " --constraint=#{const}"
  end


  result += " #{image}"
  if args = ary.select{|x| x =~ /Args/ }.first
    args = args.split("Args:").last.sub(/^\ |\t+/, '')
    if args =~ /sh -c/
      args = "sh -c \"#{args.split("sh -c").last}\""
    end

    result += " #{args}"
  end
  puts result
}