Class: Indocker::ContainerManager

Inherits:
Object
  • Object
show all
Includes:
SmartIoC::Iocify
Defined in:
lib/indocker/container/container_manager.rb

Constant Summary collapse

KEEP_CONTAINER_RUNNING_COMMAND =
%w(tail -F -n0 /etc/hosts)

Instance Method Summary collapse

Instance Method Details

#copy(name:, copy_from:, copy_to:) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/indocker/container/container_manager.rb', line 83

def copy(name:, copy_from:, copy_to:)
   = .get_by_name(name)
  
  container_id = docker_api.create_container(
    repo:    .repo, 
    tag:     .tag,
    command: KEEP_CONTAINER_RUNNING_COMMAND
  ) if !docker_api.container_exists?(name)
    
  tar_snapshot    = File.join(config.root, 'tmp', "#{name.to_s}.tar")

  docker_api.copy_from_container(name: container_id, path: copy_from) do |tar_archive|
    File.open(tar_snapshot, 'w') {|f| f.write(tar_archive)}
  end
  
  files_list = tar_helper.untar(
    io:                    File.open(tar_snapshot, 'r'),
    destination:           copy_to,
    ignore_wrap_directory: File.basename(copy_from) == '.'
  )

  FileUtils.rm_rf(tar_snapshot)
  
  docker_api.stop_container(container_id)
  docker_api.delete_container(container_id)

  files_list
end

#create(name) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/indocker/container/container_manager.rb', line 17

def create(name)
   = .get_by_name(name)

   = .env_files
    .map {|path| envs_loader.parse(config.root.join(path))}
    .inject(Indocker::Envs::EnvMetadata.new) {|sum, env| sum += env}
  
  container_id = docker_api.create_container(
    name:          name, 
    repo:          .repo, 
    tag:           .tag,
    exposed_ports: .exposed_ports,
    port_bindings: .port_bindings,
    env:           .to_array
  )

  logger.info "Successfully created container :#{name}"

  container_id
end

#delete(name) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/indocker/container/container_manager.rb', line 75

def delete(name)
  container_id = docker_api.delete_container(name)

  logger.info "Successfully deleted container :#{name}"

  container_id
end

#start(name) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/indocker/container/container_manager.rb', line 38

def start(name)
   = .get_by_name(name)
  
  container_directives_runner.run_all(
    .before_start_directives
  )

  .container_dependencies.each do |dependency|
    create(dependency) unless docker_api.container_exists?(dependency)
    
    unless docker_api.get_container_state(dependency) == Indocker::ContainerMetadata::States::RUNNING
      start(dependency)  
    end
  end

  container_id = docker_api.start_container(name)

  logger.info "Successfully started container :#{name}"
  
  container_directives_runner.run_all(
    .after_start_directives
  )

  container_id
rescue Docker::Error::ClientError => e
  logger.error "The following error occured when starting :#{name} container"
  logger.error e.message
end

#stop(name) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/indocker/container/container_manager.rb', line 67

def stop(name)
  container_id = docker_api.stop_container(name)

  logger.info "Successfully stopped container :#{name}"

  container_id
end