module Docker::Gem::Store
Constants
- CONFIG_FILE_PATH
- DEVELOPMENT_DOCKER_COMPOSE_FILE_PATH
- DOCKERFILE_PATH
- DOCKERTAG_PATH
- PRODUCTION_DOCKER_COMPOSE_FILE_PATH
- TMP_DOCKERFILE_PATH
ソースを含んだイメージをビルドする時用のDockerfile
- VERSION
Public Class Methods
build()
click to toggle source
# File lib/docker/gem/store.rb, line 62 def self.build private_class_method :build raise "No Dockerfile found" unless File.exists?(DOCKERFILE_PATH) config = get_config stdout, stderr, _ = Open3.capture3("docker build -t #{config['image']} -f #{DOCKERFILE_PATH} #{Dir.pwd}") puts stdout puts stderr if stderr # Gemfile.lockのコピー stdout, stderr, _ = Open3.capture3("docker run --rm #{config['image']} cat /gems/Gemfile.lock > #{Dir.pwd}/Gemfile.lock") puts stderr if stderr tag = tagging('development') create_or_update_docker_compose_file('development') end
create_or_update_docker_compose_file(env)
click to toggle source
# File lib/docker/gem/store.rb, line 123 def self.create_or_update_docker_compose_file(env) private_class_method :create_or_update_docker_compose_file docker_compose_file_path = case env when 'development' DEVELOPMENT_DOCKER_COMPOSE_FILE_PATH when 'production' PRODUCTION_DOCKER_COMPOSE_FILE_PATH end image_name = get_dependent_image_name(env) if File.exists?(docker_compose_file_path) content = YAML.load_file(docker_compose_file_path) content['services']['web']['image'] = image_name File.open(docker_compose_file_path,'w') do |file| YAML.dump(content,file) end else content = {'version' => '3','services' => {'web' => {'image' =>image_name,'tty' => true}}} File.open(docker_compose_file_path,'w') do |file| YAML.dump(content,file) end end end
create_tmp_dockerfile(src_path,from_image)
click to toggle source
# File lib/docker/gem/store.rb, line 146 def self.create_tmp_dockerfile(src_path,from_image) private_class_method :create_tmp_dockerfile File.open("#{TMP_DOCKERFILE_PATH}",'w') do |file| content = <<-EOS FROM #{from_image} COPY . /app EOS file.puts content end end
generate_dockerfile()
click to toggle source
# File lib/docker/gem/store.rb, line 36 def self.generate_dockerfile private_class_method :generate_dockerfile if File.exists?(DOCKERFILE_PATH) confirmed = receive_confirmation("Dockerfile.bunleを上書きしますか?") exit unless confirmed end tag = get_dependent_image_name('development') begin File.open(DOCKERFILE_PATH, "w") do |file| content = <<-EOS FROM #{tag} #DO NOT MODIFY WORKDIR PATH WORKDIR /gems COPY Gemfile /gems COPY Gemfile.lock /gems RUN bundle install EOS file.puts content end rescue => e raise e end end
get_config()
click to toggle source
# File lib/docker/gem/store.rb, line 193 def self.get_config private_class_method :get_config YAML.load_file(CONFIG_FILE_PATH) end
get_dependent_image_name(env)
click to toggle source
# File lib/docker/gem/store.rb, line 157 def self.get_dependent_image_name(env) private_class_method :get_dependent_image_name yaml = YAML.load_file(DOCKERTAG_PATH) rescue '' yaml[env] end
init()
click to toggle source
# File lib/docker/gem/store.rb, line 17 def self.init private_class_method :init if File.exists?(CONFIG_FILE_PATH) exit unless receive_confirmation(".config-gem-storeを上書きしますか?") end print 'イメージ名: ' image = STDIN.gets.chomp print 'ユーザー名: ' user = STDIN.gets.chomp print 'リポジトリ名: ' repository = STDIN.gets.chomp File.open(CONFIG_FILE_PATH, 'w') do |f| f.puts "image: #{image}" f.puts "user: #{user}" f.puts "repository: #{repository}" end end
push()
click to toggle source
# File lib/docker/gem/store.rb, line 80 def self.push private_class_method :push image_name = get_dependent_image_name('development') stdout,stderr,_ = Open3.capture3("docker push #{image_name}") puts stdout puts stderr if stderr end
receive_confirmation(message)
click to toggle source
# File lib/docker/gem/store.rb, line 198 def self.receive_confirmation(message) private_class_method :receive_confirmation begin print "#{message}(y/n): " input = STDIN.gets.chomp end while (!%w(y n Y N yes no Yes No).include? input) %w(y yes Yes).include? input end
release()
click to toggle source
# File lib/docker/gem/store.rb, line 103 def self.release private_class_method :release if File.exists?(PRODUCTION_DOCKER_COMPOSE_FILE_PATH) confirmed = receive_confirmation("#{PRODUCTION_DOCKER_COMPOSE_FILE_PATH}を書き換えますか?") exit unless confirmed end from_image = get_dependent_image_name('development') create_tmp_dockerfile(Dir.pwd,from_image) puts 'イメージのビルド中' config = get_config stdout,stderr,_ = Open3.capture3("docker build -t #{config['image']} -f #{TMP_DOCKERFILE_PATH}/ .") puts stdout puts stderr if stderr tagging('production') create_or_update_docker_compose_file('production') end
run(argv)
click to toggle source
# File lib/docker/gem/store.rb, line 207 def self.run(argv) sub_command = argv[0] case sub_command when "init" self.init when "update" self.generate_dockerfile when "build" self.build when "push" self.push when "release" self.release when "help" self.show_usage else self.show_usage end end
save_dockertag(env,tag)
click to toggle source
# File lib/docker/gem/store.rb, line 174 def self.save_dockertag(env,tag) private_class_method :save_dockertag if File.exists?(DOCKERTAG_PATH) tags = YAML.load_file(DOCKERTAG_PATH) tags[env] = tag else tags = {} tags[env] = tag end begin File.open(DOCKERTAG_PATH,'w') do |file| YAML.dump(tags,file) end rescue Exception puts '.dockertagへの書き込みに失敗しました' end end
show_usage()
click to toggle source
# File lib/docker/gem/store.rb, line 88 def self.show_usage private_class_method :show_usage usage = <<-EOS Usage: gem-store [options] options: --init gem-storeの使用を開始する --update Dockerfile.bundleの作成、または更新 --build イメージのビルドを行い、タグをつける --push docker-hubにプッシュする --help Usageを表示する EOS puts usage end
tagging(env)
click to toggle source
# File lib/docker/gem/store.rb, line 163 def self.tagging(env) private_class_method :tagging now = Time.now.strftime("%Y%m%d%H%M%S") config = get_config tag = "#{config['user']}/#{config['repository']}:#{now}" save_dockertag("#{env}",tag) `docker tag #{config['image']} #{tag}` puts tag tag end