module Dklet::DSL

Public Class Methods

dsl_method(mthd) click to toggle source
# File lib/dklet/dsl.rb, line 11
def dsl_method(mthd)
  dsl_methods << mthd
  define_method(mthd) do
    fetch_with_default(mthd)
  end
end
dsl_methods() click to toggle source
# File lib/dklet/dsl.rb, line 7
def dsl_methods
  @_dsl_methods ||= []
end
registry() click to toggle source
# File lib/dklet/dsl.rb, line 3
def registry
  @_registry ||= {}
end

Public Instance Methods

add_dsl(&blk) click to toggle source
# File lib/dklet/dsl.rb, line 23
def add_dsl &blk
  Dklet::DSL.module_eval &blk
end
add_note(str) click to toggle source
# File lib/dklet/dsl.rb, line 226
def add_note str
  (registry[:user_notes] ||= []) << str
end
app_release() click to toggle source

标识一次运行发布的用途, 如redis for hirails-only

# File lib/dklet/dsl.rb, line 373
def app_release
  ENV['APP_RELEASE'] || 'default'
end
app_tags() click to toggle source
# File lib/dklet/dsl.rb, line 306
def app_tags
  registry[:app_tags] ||= []
end
appname() click to toggle source
# File lib/dklet/dsl.rb, line 288
def appname
  fetch(:appname) || script_name
end
approot() click to toggle source
# File lib/dklet/dsl.rb, line 284
def approot
  fetch(:approot) || build_root || script_path
end
before_task(name = :main, &blk) click to toggle source
# File lib/dklet/dsl.rb, line 209
def before_task(name = :main, &blk)
  task(name, type: :before, &blk)
end
build_net() click to toggle source
# File lib/dklet/dsl.rb, line 331
def build_net
  fetch(:build_net)
end
build_root() click to toggle source
# File lib/dklet/dsl.rb, line 323
def build_root
  fetch(:build_root)
end
compose_cmd() click to toggle source

-f, –file -p, –project-name to altertive project name, eg. default net prefix

# File lib/dklet/dsl.rb, line 276
def compose_cmd
  "docker-compose -f #{specfile} --project-name #{compose_name} --project-directory #{approot}"
end
compose_name() click to toggle source

project name for docker-compose

# File lib/dklet/dsl.rb, line 270
def compose_name
  "#{fetch(:compose_name) || appname}_#{env}"
end
container_filters_for_release() click to toggle source
# File lib/dklet/dsl.rb, line 95
def container_filters_for_release
  release_label_hash.map do |k, v|
    "--filter label=#{k}=#{v}"
  end.join(' ')
end
container_missing() click to toggle source
# File lib/dklet/dsl.rb, line 352
def container_missing
  puts "Not found container for image: #{docker_image}"
end
containers_for_image(img = docker_image) click to toggle source

Note: if img1:t1 = img2:t2 points to same image hashid, they will be selected as same

# File lib/dklet/dsl.rb, line 106
def containers_for_image(img = docker_image)
  `docker ps -aq -f ancestor=#{img}`.split("\n")
end
containers_for_release() click to toggle source
# File lib/dklet/dsl.rb, line 101
def containers_for_release
  `docker ps -aq #{container_filters_for_release}`.split("\n")
end
containers_in_net(net = netname) click to toggle source
# File lib/dklet/dsl.rb, line 110
def containers_in_net(net = netname)
  `docker ps -aq -f network=#{net}`.split("\n")
end
custom_commands(&blk) click to toggle source
# File lib/dklet/dsl.rb, line 222
def custom_commands &blk
  DockletCLI.class_eval &blk
end
default_app_volumes() click to toggle source
# File lib/dklet/dsl.rb, line 390
def default_app_volumes
  volumes_root.join(release_path_name)
end
default_container_name() click to toggle source
# File lib/dklet/dsl.rb, line 348
def default_container_name
  full_release_name
end
default_docker_image() click to toggle source

release is not relevant

# File lib/dklet/dsl.rb, line 55
def default_docker_image
  "#{env}/#{appname}:#{image_tag}"
end
default_image_labels() click to toggle source
# File lib/dklet/dsl.rb, line 63
def default_image_labels
  "maintainer=dailyops built_from=dklet"
end
default_image_tag() click to toggle source
# File lib/dklet/dsl.rb, line 59
def default_image_tag
  "edge"
end
default_ops_container() click to toggle source
# File lib/dklet/dsl.rb, line 344
def default_ops_container
  containers_for_release.first # || container_name
end
disable(key) click to toggle source
# File lib/dklet/dsl.rb, line 193
def disable(key)
  (registry[:disable] ||= {})[key] = true
end
disabled?(key) click to toggle source
# File lib/dklet/dsl.rb, line 197
def disabled?(key)
  (registry[:disable] ||= {})[key]
end
dklet_config_for(name) click to toggle source

todo

# File lib/dklet/dsl.rb, line 151
def dklet_config_for(name)
  p = Pathname("/dkconf/#{full_release_name}")
  p.mkpath unless p.directory?
  p.join(name)
end
dklet_script() click to toggle source
# File lib/dklet/dsl.rb, line 114
def dklet_script
  Pathname($PROGRAM_NAME)
end
dkrun_cmd(labeled: true, opts: nil, named: false) click to toggle source

maybe from external image

# File lib/dklet/dsl.rb, line 76
def dkrun_cmd(labeled: true, opts: nil, named: false)
  cmd = "docker run"
  if labeled
    release_labels = release_label_hash.map do |k, v|
      "--label=#{k}=#{v}"
    end.join(' ')
    cmd += " #{release_labels}"
  end
  cmd += " --net #{netname}" if netname
  cmd += " --name #{container_name}" if named
  cmd += " #{opts}" if opts
  cmd
end
dktmprun(opts: nil) click to toggle source
# File lib/dklet/dsl.rb, line 90
def dktmprun(opts: nil)
  cmd = dkrun_cmd(opts: "--rm -i #{opts}", labeled: false)
  "#{cmd} #{docker_image}"
end
dockerfile() click to toggle source
# File lib/dklet/dsl.rb, line 175
def dockerfile
  rendered_file_for(:dockerfile)
end
dsl_methods() click to toggle source
# File lib/dklet/dsl.rb, line 27
def dsl_methods
  Dklet::DSL.dsl_methods
end
ensure_docker_net(name, driver: :bridge) click to toggle source
# File lib/dklet/dsl.rb, line 244
def ensure_docker_net(name, driver: :bridge)
  unless netid = find_net(name)
    puts "create new network: #{name}"
    netid = `docker network create #{name} --label #{label_pair(:name, name)} --driver=#{driver}`
  end
  netid
end
env() click to toggle source
# File lib/dklet/dsl.rb, line 360
def env
  ENV['APP_ENV'] || fetch(:default_env) || 'dev'
end
fetch(key) click to toggle source
# File lib/dklet/dsl.rb, line 35
def fetch(key)
  val = registry[key]
  if val && val.respond_to?(:call)
    val = val.call
  end
  val
end
fetch_with_default(key) click to toggle source
# File lib/dklet/dsl.rb, line 43
def fetch_with_default(key)
  provided = fetch(key)
  return provided if provided
  mthd = "default_#{key}"
  send(mthd) if respond_to?(mthd)
end
file_content_for(name) click to toggle source
# File lib/dklet/dsl.rb, line 144
def file_content_for(name)
  fpath = fetch(name)
  return unless fpath
  File.read(fpath)
end
file_for(name) click to toggle source
# File lib/dklet/dsl.rb, line 140
def file_for(name)
  fetch(name)
end
find_net(name) click to toggle source

use label (not name) filter to avoid str part match

# File lib/dklet/dsl.rb, line 253
def find_net(name)
  cmd = "docker network ls -q --filter label=#{label_pair(:name, name)}"
  netid = `#{cmd}`.chomp
  return netid unless netid.empty?
  nil
end
full_release_name() click to toggle source

take into acccount: app, env, app_release

# File lib/dklet/dsl.rb, line 293
def full_release_name
  [env, appname, app_release].compact.join('_')
end
host_domain_in_container() click to toggle source

ref dklet/mac/hostnet

# File lib/dklet/dsl.rb, line 419
def host_domain_in_container
  ENV['HOST_DOMAIN_IN_CONTAINER'] || 'host.dokcer.internal'
end
host_port_for(cport) click to toggle source
# File lib/dklet/dsl.rb, line 434
def host_port_for(cport)
  host_with_port_for(cport, only_port: true)
end
host_with_port_for(cport, host_ip: true, only_port: false ) click to toggle source

0.0.0.0:32879

# File lib/dklet/dsl.rb, line 424
def host_with_port_for(cport, host_ip: true, only_port: false )
  str = `docker port #{ops_container} #{cport}`.chomp 
  return if str.empty?
  if only_port
    return str.split(':').last
  end
  return str unless host_ip
  str.sub('0.0.0.0', Dklet::Util.host_ip)
end
in_dev?() click to toggle source
# File lib/dklet/dsl.rb, line 364
def in_dev?
  env =~ /^dev/
end
in_prod?() click to toggle source
# File lib/dklet/dsl.rb, line 368
def in_prod?
  env =~ /^prod/
end
label_key(key, prefix: true) click to toggle source
# File lib/dklet/dsl.rb, line 260
def label_key(key, prefix: true)
  prefix ? "docklet.#{key}" : key
end
label_pair(key, val, prefix: true) click to toggle source

key=value pair

# File lib/dklet/dsl.rb, line 265
def label_pair(key, val, prefix: true)
  [label_key(key, prefix: prefix), val].join('=')
end
let_cli_magic_start!() click to toggle source
# File lib/dklet/dsl.rb, line 218
def let_cli_magic_start!
  DockletCLI.start
end
netname() click to toggle source
# File lib/dklet/dsl.rb, line 240
def netname
  fetch(:netname)
end
proxy_domain_base() click to toggle source

top proxy domain part

# File lib/dklet/dsl.rb, line 400
def proxy_domain_base
  ENV['PROXY_DOMAIN_BASE'] || 'lh'
end
proxy_domains(*doms) click to toggle source
# File lib/dklet/dsl.rb, line 404
def proxy_domains(*doms)
  if doms.empty?
    doms = fetch(:domains)
    doms = [appname] if doms.nil? or doms.empty?
  end

  denv = env
  denv = nil if denv =~ /^prod/

  doms.map do |d| 
    [d, denv, proxy_domain_base].compact.join('.')
  end.join(',') 
end
raw_dockerfile() click to toggle source
# File lib/dklet/dsl.rb, line 171
def raw_dockerfile
  fetch(:dockerfile)
end
raw_specfile() click to toggle source
# File lib/dklet/dsl.rb, line 184
def raw_specfile
  fetch(:specfile)
end
register(key, value) click to toggle source
# File lib/dklet/dsl.rb, line 31
def register(key, value)
  registry[key] = value
end
register_app_tag(tag) click to toggle source
# File lib/dklet/dsl.rb, line 302
def register_app_tag(tag)
  app_tags << tag
end
register_approot(path) click to toggle source
# File lib/dklet/dsl.rb, line 280
def register_approot path
  register_path(:approot, path)
end
register_build_net(net) click to toggle source
# File lib/dklet/dsl.rb, line 327
def register_build_net net
  register(:build_net, net)
end
register_build_root(path) click to toggle source
# File lib/dklet/dsl.rb, line 319
def register_build_root path
  register_path(:build_root, path)
end
register_default_env(str) click to toggle source
# File lib/dklet/dsl.rb, line 356
def register_default_env(str)
  register :default_env, str
end
register_docker_image(name) click to toggle source
# File lib/dklet/dsl.rb, line 50
def register_docker_image(name)
  register :docker_image, name
end
register_domain(*doms) click to toggle source

domain

# File lib/dklet/dsl.rb, line 395
def register_domain(*doms)
  register :domains, doms
end
register_net(name = :dailyops, build: false) click to toggle source

docker networking

# File lib/dklet/dsl.rb, line 235
def register_net(name = :dailyops, build: false)
  register :netname, name
  ensure_docker_net(name) if build
end
register_ops(cid) click to toggle source
# File lib/dklet/dsl.rb, line 340
def register_ops(cid)
  register :ops_container, cid
end
register_path(key, path) click to toggle source
# File lib/dklet/dsl.rb, line 335
def register_path key, path
  path = Pathname(path) unless path.is_a?(Pathname)
  register key, path
end
registry() click to toggle source
# File lib/dklet/dsl.rb, line 19
def registry
  Dklet::DSL.registry
end
release_label_hash() click to toggle source
# File lib/dklet/dsl.rb, line 67
def release_label_hash
  {
    dklet_env: env,
    dklet_app: appname,
    dklet_release: app_release
  }
end
release_path_name() click to toggle source

make path friendly

# File lib/dklet/dsl.rb, line 298
def release_path_name
  full_release_name.gsub(/_/, '-')
end
rendered_file_for(name, locals: {}, in_binding: binding) click to toggle source
# File lib/dklet/dsl.rb, line 157
def rendered_file_for(name, locals: {}, in_binding: binding)
  tmpl = file_content_for(name)
  return unless tmpl
  erb = ERB.new(tmpl, nil, '%<>')
  rendered = erb.result(in_binding)
  tmpfile_for(rendered)
end
script_name() click to toggle source

use <parent_path_name>_<script_file_name> to ensure possible unique

# File lib/dklet/dsl.rb, line 124
def script_name # not file name
  sname = fetch(:script_name)
  return sname if sname
  name = dklet_script.basename('.rb').to_s
  pname = script_path.basename.to_s
  "#{pname}_#{name}"
end
script_path() click to toggle source

触发脚本所在(绝对)路径

# File lib/dklet/dsl.rb, line 119
def script_path
  dklet_script.realdirpath.dirname
end
set_file_for(name, str) click to toggle source
# File lib/dklet/dsl.rb, line 136
def set_file_for(name, str)
  register name, tmpfile_for(str)
end
smart_build_context_path() click to toggle source
# File lib/dklet/dsl.rb, line 310
def smart_build_context_path
  # use explicitly specified, maybe nil
  return build_root if registry.has_key?(:build_root)
  # check build path dependent
  body = File.read(dockerfile)
  need_path = body =~ /^\s*(ADD|COPY)\s/i
  script_path if need_path
end
specfile() click to toggle source

rendered in current context

# File lib/dklet/dsl.rb, line 189
def specfile
  rendered_file_for(:specfile)
end
task(name = :main, opts={}, &blk) click to toggle source

main dsl

# File lib/dklet/dsl.rb, line 202
def task(name = :main, opts={}, &blk)
  type = opts.delete(:type) || :after
  hooks_name = "#{name}_#{type}_hooks".to_sym 
  (registry[hooks_name] ||= []) << blk
  task_opts(name).merge!(opts) unless opts.empty?
end
task_opts(name = :main) click to toggle source
# File lib/dklet/dsl.rb, line 213
def task_opts(name = :main)
  key = "opts_for_task_#{name}".to_sym
  registry[key] ||= {}
end
tmpfile_for(str) click to toggle source
# File lib/dklet/dsl.rb, line 132
def tmpfile_for(str)
  Dklet::Util.tmpfile_for(str)
end
user_notes() click to toggle source
# File lib/dklet/dsl.rb, line 230
def user_notes
  fetch(:user_notes)
end
volumes_root() click to toggle source
# File lib/dklet/dsl.rb, line 377
def volumes_root
  vols_root = "#{ENV['HOME']}/DockerVolumes"
  root = fetch(:volumes_root) || if File.directory?(vols_root)
      # friendly to File sharing on Docker for Mac
      vols_root
    else
      '~/docker-volumes'
    end
  proot = Pathname(root)
  proot.mkpath unless proot.directory?
  proot
end
write_dockerfile(str, path: nil) click to toggle source

Dockerfile for image build

# File lib/dklet/dsl.rb, line 166
def write_dockerfile(str, path: nil)
  set_file_for(:dockerfile, str)
  register_build_root(path) if path
end
write_specfile(str) click to toggle source

specfile for k8s resources spec manifest

# File lib/dklet/dsl.rb, line 180
def write_specfile(str)
  set_file_for(:specfile, str)
end