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
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