Method: Contur::Controller.run

Defined in:
lib/contur/controller.rb

.run(config_path: nil, webroot: nil, initscripts: nil) {|"MySQL container: #{mysql_container.id[0, 10]}"| ... } ⇒ Object

rubocop:disable Metrics/PerceivedComplexity, Lint/UnusedMethodArgument, Metrics/MethodLength

Yields:

  • ("MySQL container: #{mysql_container.id[0, 10]}")


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/contur/controller.rb', line 68

def self.run(config_path: nil, webroot: nil, initscripts: nil)
  unless image_exist?
    yield "Image doesn't exist" if block_given?
    return false
  end

  bind_volumes = []

  if !webroot.nil? && Dir.exist?(File.expand_path(webroot))
    bind_volumes << "#{webroot}:/www"
  end
  if !initscripts.nil? && Dir.exist?(File.expand_path(initscripts))
    bind_volumes << "#{initscripts}:/initscripts"
  end

  if c = container?
    yield 'Removing existing contur container...' if block_given?
    c.remove(force: true)
  end

  mysql_container_version = "mysql:#{config.use['mysql']}"
  unless Docker::Image.exist? mysql_container_version
    yield "Downloading #{mysql_container_version}..." if block_given?
    Docker::Image.create('fromImage' => mysql_container_version)
  end

  mysql_container_name = mysql_container_version.tr(':.', '_')

  stop_mysql_containers(except: mysql_container_version)
  begin
    mysql_container = Docker::Container.get(mysql_container_name)
  rescue Docker::Error::NotFoundError
    yield 'Creating MySQL container...' if block_given?
    mysql_container = Docker::Container.create(
      'name' => mysql_container_name,
      'Image' => mysql_container_version,
      'Env' => ['MYSQL_ROOT_PASSWORD=admin']
    )
  ensure
    mysql_container_info = Docker::Container.get(mysql_container.id).info
    unless mysql_container_info['State']['Running']
      yield 'Starting MySQL container...' if block_given?
      mysql_container.start!
      sleep 10
    end
  end
  mysql_container_info = Docker::Container.get(mysql_container.id).info
  unless mysql_container_info['State']['Running']
    yield "Couldn't start MySQL container" if block_given?
    return false
  end
  yield "MySQL container: #{mysql_container.id[0, 10]}" if block_given?

  yield 'Creating Contur container...' if block_given?
  container = Docker::Container.create(
    'name' => Contur::Utils.generate_conatiner_name,
    'Image' => Contur::IMAGE_NAME,
    'Cmd' => ['/init.sh'],
    'Volumes' => {
      "#{Dir.pwd}/webroot" => {},
      "#{Dir.pwd}/initscripts" => {}
    },
    'ExposedPorts' => {
      '80/tcp' => {}
    },
    'HostConfig' => {
      'Links' => ["#{mysql_container_name}:mysql"],
      'PortBindings' => {
        '80/tcp' => [{ 'HostPort' => '8088' }]
      },
      'Binds' => bind_volumes
    }
  )

  container.store_file('/init.sh', content: load_init_script, permissions: 0o777)

  container.start!
end