docker-sync 0.4.6 → 0.5.0.pre.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/console +6 -0
- data/lib/docker-sync.rb +2 -1
- data/lib/docker-sync/config/project_config.rb +13 -12
- data/lib/docker-sync/dependencies.rb +39 -0
- data/lib/docker-sync/dependencies/docker.rb +23 -0
- data/lib/docker-sync/dependencies/docker_driver.rb +20 -0
- data/lib/docker-sync/dependencies/fswatch.rb +14 -0
- data/lib/docker-sync/dependencies/package_manager.rb +24 -0
- data/lib/docker-sync/dependencies/package_managers/apt.rb +24 -0
- data/lib/docker-sync/dependencies/package_managers/base.rb +47 -0
- data/lib/docker-sync/dependencies/package_managers/brew.rb +24 -0
- data/lib/docker-sync/dependencies/package_managers/none.rb +23 -0
- data/lib/docker-sync/dependencies/package_managers/pkg.rb +24 -0
- data/lib/docker-sync/dependencies/package_managers/yum.rb +24 -0
- data/lib/docker-sync/dependencies/rsync.rb +14 -0
- data/lib/docker-sync/dependencies/unison.rb +15 -0
- data/lib/docker-sync/dependencies/unox.rb +40 -0
- data/lib/docker-sync/environment.rb +19 -0
- data/lib/docker-sync/execution.rb +11 -35
- data/lib/docker-sync/sync_manager.rb +10 -3
- data/lib/docker-sync/sync_process.rb +16 -18
- data/lib/docker-sync/sync_strategy/native.rb +3 -4
- data/lib/docker-sync/sync_strategy/native_osx.rb +11 -11
- data/lib/docker-sync/sync_strategy/rsync.rb +15 -7
- data/lib/docker-sync/sync_strategy/unison.rb +13 -12
- data/lib/docker-sync/update_check.rb +5 -0
- data/lib/docker-sync/upgrade_check.rb +2 -1
- data/lib/docker-sync/watch_strategy/dummy.rb +1 -1
- data/lib/docker-sync/watch_strategy/fswatch.rb +4 -5
- data/lib/docker-sync/watch_strategy/remotelogs.rb +3 -3
- data/lib/docker-sync/watch_strategy/unison.rb +2 -2
- data/tasks/daemon/daemon.thor +0 -1
- data/tasks/stack/stack.thor +8 -9
- data/tasks/sync/sync.thor +16 -19
- metadata +21 -9
- data/lib/docker-sync/preconditions/preconditions_linux.rb +0 -51
- data/lib/docker-sync/preconditions/preconditions_osx.rb +0 -174
- data/lib/docker-sync/preconditions/strategy.rb +0 -65
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'os'
|
2
|
+
|
3
|
+
module DockerSync
|
4
|
+
module Environment
|
5
|
+
def self.linux?
|
6
|
+
return @linux if defined? @linux
|
7
|
+
@linux = OS.linux?
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.mac?
|
11
|
+
return @mac if defined? @mac
|
12
|
+
@mac = OS.mac?
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.freebsd?
|
16
|
+
@freebsd ||= OS.freebsd?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,55 +2,31 @@ require 'open3'
|
|
2
2
|
require 'thor/shell'
|
3
3
|
|
4
4
|
module Execution
|
5
|
-
|
6
5
|
Thread.abort_on_exception = true
|
7
6
|
|
8
|
-
def
|
9
|
-
|
10
|
-
if prefix.nil?
|
11
|
-
# TODO: probably pick the command name without args
|
12
|
-
prefix = 'unknown'
|
13
|
-
end
|
14
|
-
|
15
|
-
if color.nil?
|
16
|
-
color = :cyan
|
17
|
-
end
|
18
|
-
|
19
|
-
Thread.new {
|
7
|
+
def thread_exec(command, prefix = 'unknown', color = :cyan)
|
8
|
+
Thread.new do
|
20
9
|
Open3.popen3(command) do |_, stdout, stderr, _|
|
21
|
-
|
22
10
|
# noinspection RubyAssignmentExpressionInConditionalInspection
|
23
11
|
while line_out = stdout.gets
|
24
|
-
say_status prefix, line_out, color
|
12
|
+
say_status with_time(prefix), line_out, color
|
25
13
|
end
|
26
14
|
|
27
15
|
# noinspection RubyAssignmentExpressionInConditionalInspection
|
28
16
|
while line_err = stderr.gets
|
29
|
-
say_status prefix, line_err, :red
|
17
|
+
say_status with_time(prefix), line_err, :red
|
30
18
|
end
|
31
|
-
|
32
19
|
end
|
33
|
-
|
34
|
-
|
20
|
+
end
|
35
21
|
end
|
36
22
|
|
37
23
|
# unison doesn't work when ran in a new thread
|
38
24
|
# this functions creates a full new process instead
|
39
|
-
def
|
40
|
-
|
41
|
-
if prefix.nil?
|
42
|
-
# TODO: probably pick the command name without args
|
43
|
-
prefix = 'unknown'
|
44
|
-
end
|
45
|
-
|
46
|
-
if color.nil?
|
47
|
-
color = :cyan
|
48
|
-
end
|
49
|
-
|
50
|
-
Process.fork {
|
51
|
-
`#{command}` || raise(command + ' failed')
|
52
|
-
}
|
53
|
-
|
25
|
+
def fork_exec(command, _prefix = 'unknown', _color = :cyan)
|
26
|
+
Process.fork { `#{command}` || raise(command + ' failed') }
|
54
27
|
end
|
55
28
|
|
56
|
-
|
29
|
+
def with_time(prefix)
|
30
|
+
"[#{Time.now}] #{prefix}"
|
31
|
+
end
|
32
|
+
end
|
@@ -4,7 +4,7 @@ require 'docker-sync/sync_process'
|
|
4
4
|
# noinspection RubyResolve
|
5
5
|
require 'docker-sync/execution'
|
6
6
|
|
7
|
-
module
|
7
|
+
module DockerSync
|
8
8
|
class SyncManager
|
9
9
|
include Thor::Shell
|
10
10
|
|
@@ -40,6 +40,13 @@ module Docker_sync
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
# set the global max_attempt setting, if the sync-endpoint does not define a own one
|
44
|
+
unless config.key?('max_attempt')
|
45
|
+
if @config_global.key?('max_attempt')
|
46
|
+
@config_syncs[name]['max_attempt'] = @config_global['max_attempt']
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
43
50
|
if @config_syncs[name].key?('dest')
|
44
51
|
puts 'Please do no longer use "dest" in your docker-sync.yml configuration - also see https://github.com/EugenMayer/docker-sync/wiki/1.2-Upgrade-Guide#dest-has-been-removed!'
|
45
52
|
exit 1
|
@@ -118,14 +125,14 @@ module Docker_sync
|
|
118
125
|
sync_process.stop
|
119
126
|
end
|
120
127
|
|
121
|
-
rescue
|
128
|
+
rescue StandardError => e
|
122
129
|
puts "EXCEPTION: #{e.inspect}"
|
123
130
|
puts "MESSAGE: #{e.message}"
|
124
131
|
end
|
125
132
|
end
|
126
133
|
|
127
134
|
def create_sync(sync_name, sync_configuration)
|
128
|
-
sync_process =
|
135
|
+
sync_process = DockerSync::SyncProcess.new(sync_name, sync_configuration)
|
129
136
|
return sync_process
|
130
137
|
end
|
131
138
|
|
@@ -11,7 +11,7 @@ require 'docker-sync/watch_strategy/dummy'
|
|
11
11
|
require 'docker-sync/watch_strategy/unison'
|
12
12
|
require 'docker-sync/watch_strategy/remotelogs'
|
13
13
|
|
14
|
-
module
|
14
|
+
module DockerSync
|
15
15
|
class SyncProcess
|
16
16
|
include Thor::Shell
|
17
17
|
@options
|
@@ -43,13 +43,13 @@ module Docker_Sync
|
|
43
43
|
def set_sync_strategy
|
44
44
|
case @options['sync_strategy']
|
45
45
|
when 'rsync'
|
46
|
-
@sync_strategy =
|
46
|
+
@sync_strategy = DockerSync::SyncStrategy::Rsync.new(@sync_name, @options)
|
47
47
|
when 'unison'
|
48
|
-
@sync_strategy =
|
48
|
+
@sync_strategy = DockerSync::SyncStrategy::Unison.new(@sync_name, @options)
|
49
49
|
when 'native'
|
50
|
-
@sync_strategy =
|
50
|
+
@sync_strategy = DockerSync::SyncStrategy::Native.new(@sync_name, @options)
|
51
51
|
when 'native_osx'
|
52
|
-
@sync_strategy =
|
52
|
+
@sync_strategy = DockerSync::SyncStrategy::NativeOsx.new(@sync_name, @options)
|
53
53
|
else
|
54
54
|
raise "Unknown sync_strategy #{@options['sync_strategy']}"
|
55
55
|
end
|
@@ -58,29 +58,27 @@ module Docker_Sync
|
|
58
58
|
def set_watch_strategy
|
59
59
|
case @options['watch_strategy']
|
60
60
|
when 'fswatch'
|
61
|
-
@watch_strategy =
|
61
|
+
@watch_strategy = DockerSync::WatchStrategy::Fswatch.new(@sync_name, @options)
|
62
62
|
when 'dummy'
|
63
|
-
@watch_strategy =
|
63
|
+
@watch_strategy = DockerSync::WatchStrategy::Dummy.new(@sync_name, @options)
|
64
64
|
when 'unison'
|
65
|
-
@watch_strategy =
|
65
|
+
@watch_strategy = DockerSync::WatchStrategy::Unison.new(@sync_name, @options)
|
66
66
|
when 'remotelogs'
|
67
|
-
@watch_strategy =
|
67
|
+
@watch_strategy = DockerSync::WatchStrategy::Remote_logs.new(@sync_name, @options)
|
68
68
|
else
|
69
69
|
raise "Unknown watch_strategy #{@options['watch_strategy']}"
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
def get_host_ip_default
|
74
|
-
return '127.0.0.1'
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
raise "Error getting sync_host_ip automatically, exit code #{$?.exitstatus} ... #{stderr}"
|
81
|
-
end
|
82
|
-
return stdout.gsub("\n",'')
|
74
|
+
return '127.0.0.1' unless Dependencies::Docker::Driver.docker_toolbox?
|
75
|
+
|
76
|
+
cmd = 'docker-machine ip $(docker-machine active)'
|
77
|
+
stdout, stderr, exit_status = Open3.capture3(cmd)
|
78
|
+
unless exit_status.success?
|
79
|
+
raise "Error getting sync_host_ip automatically, exit code #{$?.exitstatus} ... #{stderr}"
|
83
80
|
end
|
81
|
+
stdout.gsub("\n",'')
|
84
82
|
end
|
85
83
|
|
86
84
|
def run
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'thor/shell'
|
2
|
-
require 'docker-sync/preconditions/strategy'
|
3
2
|
|
4
|
-
module
|
3
|
+
module DockerSync
|
5
4
|
module SyncStrategy
|
6
5
|
class Native
|
7
6
|
include Thor::Shell
|
@@ -14,8 +13,8 @@ module Docker_Sync
|
|
14
13
|
@options = options
|
15
14
|
|
16
15
|
begin
|
17
|
-
|
18
|
-
rescue
|
16
|
+
Dependencies::Docker.ensure!
|
17
|
+
rescue StandardError => e
|
19
18
|
say_status 'error', "#{@sync_name} has been configured to sync with native docker volume, but docker is not found", :red
|
20
19
|
say_status 'error', e.message, :red
|
21
20
|
exit 1
|
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'thor/shell'
|
2
|
-
require 'docker-sync/preconditions/strategy'
|
3
2
|
require 'docker-sync/execution'
|
4
3
|
require 'docker-sync/update_check'
|
5
4
|
require 'open3'
|
6
5
|
require 'socket'
|
7
6
|
require 'terminal-notifier'
|
8
7
|
|
9
|
-
module
|
8
|
+
module DockerSync
|
10
9
|
module SyncStrategy
|
11
10
|
class NativeOsx
|
12
11
|
include Thor::Shell
|
@@ -32,8 +31,8 @@ module Docker_Sync
|
|
32
31
|
uc.check_unison_hostsync_image(true)
|
33
32
|
|
34
33
|
begin
|
35
|
-
|
36
|
-
rescue
|
34
|
+
Dependencies::Docker.ensure!
|
35
|
+
rescue StandardError => e
|
37
36
|
say_status 'error', "#{@sync_name} has been configured to sync with native docker volume, but docker is not found", :red
|
38
37
|
say_status 'error', e.message, :red
|
39
38
|
exit 1
|
@@ -43,10 +42,10 @@ module Docker_Sync
|
|
43
42
|
def start_container
|
44
43
|
say_status 'ok', "Starting native_osx for sync #{@sync_name}", :white
|
45
44
|
container_name = get_container_name
|
46
|
-
host_sync_src = @options['src']
|
45
|
+
host_sync_src = File.realpath(@options['src'])
|
47
46
|
volume_app_sync_name = @sync_name
|
48
47
|
env = {}
|
49
|
-
raise 'sync_user is no longer supported, since it
|
48
|
+
raise 'sync_user is no longer supported, since it is not needed. Use sync_userid only please' if @options.key?('sync_user')
|
50
49
|
|
51
50
|
ignore_strings = expand_ignore_strings
|
52
51
|
env['UNISON_EXCLUDES'] = ignore_strings.join(' ')
|
@@ -80,11 +79,12 @@ module Docker_Sync
|
|
80
79
|
run_privileged = '--privileged' if @options.key?('max_inotify_watches') #TODO: replace by the minimum capabilities required
|
81
80
|
say_status 'ok', 'Starting precopy', :white if @options['verbose']
|
82
81
|
# we just run the precopy script and remove the container
|
83
|
-
cmd = "docker run --rm -v #{volume_app_sync_name}:/app_sync -v #{host_sync_src}:/host_sync#{host_disk_mount_mode} -e HOST_VOLUME=/host_sync -e APP_VOLUME=/app_sync -e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`} #{additional_docker_env} #{run_privileged} --name #{container_name} #{@docker_image} /usr/local/bin/precopy_appsync"
|
84
|
-
|
82
|
+
cmd = "docker run --rm -v \"#{volume_app_sync_name}:/app_sync\" -v \"#{host_sync_src}:/host_sync#{host_disk_mount_mode}\" -e HOST_VOLUME=/host_sync -e APP_VOLUME=/app_sync -e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`} #{additional_docker_env} #{run_privileged} --name #{container_name} #{@docker_image} /usr/local/bin/precopy_appsync"
|
83
|
+
say_status 'precopy', cmd, :white if @options['verbose']
|
84
|
+
system(cmd) || raise('Precopy failed')
|
85
85
|
say_status 'ok', 'Starting container', :white if @options['verbose']
|
86
86
|
# this will be run below and start unison, since we did not manipulate CMD
|
87
|
-
cmd = "docker run -d -v #{volume_app_sync_name}:/app_sync -v #{host_sync_src}:/host_sync -e HOST_VOLUME=/host_sync -e APP_VOLUME=/app_sync -e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`} #{additional_docker_env} #{run_privileged} --name #{container_name} #{@docker_image}"
|
87
|
+
cmd = "docker run -d -v \"#{volume_app_sync_name}:/app_sync\" -v \"#{host_sync_src}:/host_sync#{host_disk_mount_mode}\" -e HOST_VOLUME=/host_sync -e APP_VOLUME=/app_sync -e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`} #{additional_docker_env} #{run_privileged} --name #{container_name} #{@docker_image}"
|
88
88
|
else
|
89
89
|
say_status 'ok', "starting #{container_name} container", :white if @options['verbose']
|
90
90
|
cmd = "docker start #{container_name} && docker exec #{container_name} supervisorctl restart unison"
|
@@ -94,7 +94,7 @@ module Docker_Sync
|
|
94
94
|
cmd = "docker exec #{container_name} supervisorctl restart unison"
|
95
95
|
end
|
96
96
|
say_status 'command', cmd, :white if @options['verbose']
|
97
|
-
|
97
|
+
system(cmd) || raise('Start failed')
|
98
98
|
say_status 'ok', "starting initial sync of #{container_name}", :white if @options['verbose']
|
99
99
|
# wait until container is started, then sync:
|
100
100
|
say_status 'success', 'Sync container started', :green
|
@@ -122,7 +122,7 @@ module Docker_Sync
|
|
122
122
|
say_status 'ok', "Stopping sync container #{get_container_name}"
|
123
123
|
begin
|
124
124
|
stop_container
|
125
|
-
rescue
|
125
|
+
rescue StandardError => e
|
126
126
|
say_status 'error', "Stopping failed of #{get_container_name}:", :red
|
127
127
|
puts e.message
|
128
128
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'thor/shell'
|
2
|
-
require 'docker-sync/preconditions/strategy'
|
3
2
|
require 'terminal-notifier'
|
4
3
|
|
5
|
-
module
|
4
|
+
module DockerSync
|
6
5
|
module SyncStrategy
|
7
6
|
class Rsync
|
8
7
|
include Thor::Shell
|
@@ -22,8 +21,8 @@ module Docker_Sync
|
|
22
21
|
end
|
23
22
|
|
24
23
|
begin
|
25
|
-
|
26
|
-
rescue
|
24
|
+
Dependencies::Rsync.ensure!
|
25
|
+
rescue StandardError => e
|
27
26
|
say_status 'error', "#{@sync_name} has been configured to sync with rsync, but no rsync or fswatch binary available", :red
|
28
27
|
say_status 'error', e.message, :red
|
29
28
|
exit 1
|
@@ -97,8 +96,9 @@ module Docker_Sync
|
|
97
96
|
|
98
97
|
user_mapping = get_user_mapping
|
99
98
|
group_mapping = get_group_mapping
|
99
|
+
docker_env = get_docker_env
|
100
100
|
|
101
|
-
cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{volume_name}:#{@options['dest']} #{user_mapping} #{group_mapping}
|
101
|
+
cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{volume_name}:#{@options['dest']} #{user_mapping} #{group_mapping} #{docker_env} --name #{container_name} -d #{@docker_image}"
|
102
102
|
else # container already created, just start / reuse it
|
103
103
|
say_status 'ok', "starting #{container_name} container", :white if @options['verbose']
|
104
104
|
cmd = "docker start #{container_name}"
|
@@ -126,12 +126,20 @@ module Docker_Sync
|
|
126
126
|
def get_group_mapping
|
127
127
|
group_mapping = ''
|
128
128
|
if @options.key?('sync_groupid')
|
129
|
-
raise 'for now, rsync does no longer support groupid, but for nearly all cases sync_userid should be
|
129
|
+
raise 'for now, rsync does no longer support groupid, but for nearly all cases sync_userid should be enough'
|
130
130
|
#group_mapping = "#{group_mapping} -e GROUP_ID=#{@options['sync_groupid']}"
|
131
131
|
end
|
132
132
|
return group_mapping
|
133
133
|
end
|
134
134
|
|
135
|
+
def get_docker_env
|
136
|
+
env_mapping = []
|
137
|
+
env_mapping << "-e VOLUME=#{@options['dest']}"
|
138
|
+
env_mapping << "-e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`}"
|
139
|
+
env_mapping << "-e ALLOW=#{@options['sync_host_allow']}" if @options['sync_host_allow']
|
140
|
+
env_mapping.join(' ')
|
141
|
+
end
|
142
|
+
|
135
143
|
def stop_container
|
136
144
|
`docker ps | grep #{get_container_name} && docker stop #{get_container_name}`
|
137
145
|
end
|
@@ -150,7 +158,7 @@ module Docker_Sync
|
|
150
158
|
say_status 'ok', "Stopping sync container #{get_container_name}"
|
151
159
|
begin
|
152
160
|
stop_container
|
153
|
-
rescue
|
161
|
+
rescue StandardError => e
|
154
162
|
say_status 'error', "Stopping failed of #{get_container_name}:", :red
|
155
163
|
puts e.message
|
156
164
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'thor/shell'
|
2
|
-
require 'docker-sync/preconditions/strategy'
|
3
2
|
require 'docker-sync/execution'
|
4
3
|
require 'open3'
|
5
4
|
require 'socket'
|
6
5
|
require 'terminal-notifier'
|
7
6
|
|
8
|
-
module
|
7
|
+
module DockerSync
|
9
8
|
module SyncStrategy
|
10
9
|
class Unison
|
11
10
|
include Thor::Shell
|
@@ -26,8 +25,8 @@ module Docker_Sync
|
|
26
25
|
@docker_image = 'eugenmayer/unison'
|
27
26
|
end
|
28
27
|
begin
|
29
|
-
|
30
|
-
rescue
|
28
|
+
Dependencies::Unison.ensure!
|
29
|
+
rescue StandardError => e
|
31
30
|
say_status 'error', "#{@sync_name} has been configured to sync with unison, but no unison available", :red
|
32
31
|
say_status 'error', e.message, :red
|
33
32
|
exit 1
|
@@ -67,7 +66,7 @@ module Docker_Sync
|
|
67
66
|
cmd = cmd + 'unison ' + args.join(' ')
|
68
67
|
|
69
68
|
say_status 'command', cmd, :white if @options['verbose']
|
70
|
-
|
69
|
+
fork_exec(cmd, "Sync #{@sync_name}", :blue)
|
71
70
|
end
|
72
71
|
|
73
72
|
def sync
|
@@ -135,9 +134,9 @@ module Docker_Sync
|
|
135
134
|
def sync_prefer
|
136
135
|
case @options.fetch('sync_prefer', 'default')
|
137
136
|
when 'default' then "-prefer '#{@options['src']}' -copyonconflict" # thats our default, if nothing is set
|
138
|
-
when 'src' then "-prefer #{@options['src']}"
|
139
|
-
when 'dest' then "-prefer #{@options['dest']}"
|
140
|
-
else "-prefer #{@options['sync_prefer']}"
|
137
|
+
when 'src' then "-prefer '#{@options['src']}'"
|
138
|
+
when 'dest' then "-prefer '#{@options['dest']}'"
|
139
|
+
else "-prefer '#{@options['sync_prefer']}'"
|
141
140
|
end
|
142
141
|
end
|
143
142
|
|
@@ -165,6 +164,7 @@ module Docker_Sync
|
|
165
164
|
exists = `docker ps --filter "status=exited" --filter "name=#{container_name}" --format "{{.Names}}" | grep '^#{container_name}$'`
|
166
165
|
if exists == ''
|
167
166
|
say_status 'ok', "creating #{container_name} container", :white if @options['verbose']
|
167
|
+
run_privileged = ''
|
168
168
|
run_privileged = '--privileged' if @options.key?('max_inotify_watches') #TODO: replace by the minimum capabilities required
|
169
169
|
cmd = "docker run -p '#{@options['sync_host_ip']}::#{UNISON_CONTAINER_PORT}' -v #{volume_name}:#{@options['dest']} -e VOLUME=#{@options['dest']} -e TZ=${TZ-`readlink /etc/localtime | sed -e 's,/usr/share/zoneinfo/,,'`} #{additional_docker_env} #{run_privileged} --name #{container_name} -d #{@docker_image}"
|
170
170
|
else
|
@@ -185,22 +185,23 @@ module Docker_Sync
|
|
185
185
|
attempt = 0
|
186
186
|
max_attempt = @options['max_attempt'] || 5
|
187
187
|
loop do
|
188
|
+
# noinspection RubyUnusedLocalVariable
|
188
189
|
stdout, stderr, exit_status = Open3.capture3(cmd)
|
189
190
|
break if exit_status == 0
|
190
191
|
attempt += 1
|
191
|
-
raise
|
192
|
+
raise "Failed to start unison container in time, try to increase max_attempt (currently #{max_attempt}) in your configuration. See https://github.com/EugenMayer/docker-sync/wiki/2.-Configuration for more informations" if attempt > max_attempt
|
192
193
|
sleep 1
|
193
194
|
end
|
194
195
|
sync
|
195
196
|
say_status 'success', 'Unison server started', :green
|
196
197
|
end
|
197
198
|
|
199
|
+
# noinspection RubyUnusedLocalVariable
|
198
200
|
def get_host_port(container_name, container_port)
|
199
|
-
File.exist?('/usr/bin/sed') ? sed = '/usr/bin/sed' : sed = `which sed`.chomp # use macOS native sed in /usr/bin/sed first, fallback to sed in $PATH if it's not there
|
200
201
|
cmd = 'docker inspect --format=\'{{(index (index .NetworkSettings.Ports "5000/tcp") 0).HostPort}}\' ' + container_name
|
201
202
|
say_status 'command', cmd, :white if @options['verbose']
|
202
203
|
stdout, stderr, exit_status = Open3.capture3(cmd)
|
203
|
-
|
204
|
+
unless exit_status.success?
|
204
205
|
say_status 'command', cmd
|
205
206
|
say_status 'error', "Error getting mapped port, exit code #{$?.exitstatus}", :red
|
206
207
|
say_status 'message', stderr
|
@@ -234,7 +235,7 @@ module Docker_Sync
|
|
234
235
|
say_status 'ok', "Stopping sync container #{get_container_name}"
|
235
236
|
begin
|
236
237
|
stop_container
|
237
|
-
rescue
|
238
|
+
rescue StandardError => e
|
238
239
|
say_status 'error', "Stopping failed of #{get_container_name}:", :red
|
239
240
|
puts e.message
|
240
241
|
end
|
@@ -13,6 +13,7 @@ class UpdateChecker
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def run
|
16
|
+
return if ENV['DOCKER_SYNC_SKIP_UPDATE']
|
16
17
|
unless @config['update_check']
|
17
18
|
say_status 'hint','Skipping up-to-date check since it has been disabled in your ~/.docker-sync-global.yml configuration',:yellow
|
18
19
|
return
|
@@ -56,6 +57,7 @@ class UpdateChecker
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def check_rsync_image
|
60
|
+
return if ENV['DOCKER_SYNC_SKIP_UPDATE']
|
59
61
|
say_status 'ok','Checking if a newer rsync image is available'
|
60
62
|
|
61
63
|
if system("docker pull eugenmayer/rsync | grep 'Downloaded newer image for'")
|
@@ -68,6 +70,7 @@ class UpdateChecker
|
|
68
70
|
end
|
69
71
|
|
70
72
|
def check_unison_hostsync_image(silent = false)
|
73
|
+
return if ENV['DOCKER_SYNC_SKIP_UPDATE']
|
71
74
|
say_status 'ok','Checking if a newer native_osx (unison:hostsync_0.2) image is available' unless silent
|
72
75
|
|
73
76
|
if system("docker pull eugenmayer/unison:hostsync_0.2 | grep 'Downloaded newer image for'")
|
@@ -80,6 +83,7 @@ class UpdateChecker
|
|
80
83
|
end
|
81
84
|
|
82
85
|
def check_unison_image
|
86
|
+
return if ENV['DOCKER_SYNC_SKIP_UPDATE']
|
83
87
|
say_status 'ok','Checking if a newer unison image is available'
|
84
88
|
|
85
89
|
if system("docker pull eugenmayer/unison | grep 'Downloaded newer image for'")
|
@@ -104,6 +108,7 @@ class UpdateChecker
|
|
104
108
|
end
|
105
109
|
|
106
110
|
def check_and_warn(update_enforced = true)
|
111
|
+
return if ENV['DOCKER_SYNC_SKIP_UPDATE']
|
107
112
|
# update the timestamp
|
108
113
|
@config.update! 'update_last_check' => DateTime.now.iso8601(9)
|
109
114
|
|