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