docker-sync 0.4.0.pre.beta1 → 0.4.0.pre.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/docker-sync/config/project_config.rb +2 -2
- data/lib/docker-sync/sync_manager.rb +1 -0
- data/lib/docker-sync/sync_strategy/native_osx.rb +70 -50
- data/tasks/sync/sync.thor +25 -13
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c66c65a38606565e60bf76aa80b33934690b6851
|
4
|
+
data.tar.gz: ee1aa4c4a84dfbb9eb9dfdbaa5fc31d3a27cef46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 250dc5898a0f2e92ad7208bec4ff1c92b1a3177daf1873c8768ec634e6e4e3f1b68c2a3f8aa5e1fb8c9c9e3ca49952dcd360a41b25b1102060672727cfa52fd3
|
7
|
+
data.tar.gz: c59ef8da87e69dd577bb9f647de17ed9db331e6b4a6aae73210c7c1cecd05053145c89222fa8f96332d72afb794fab8e33624b203182ee22a0487e809da8b436
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.0-
|
1
|
+
0.4.0-beta2
|
@@ -126,7 +126,7 @@ module DockerSync
|
|
126
126
|
watch_strategy = sync_config['watch_strategy']
|
127
127
|
watch_strategy = 'dummy' if watch_strategy == 'disable'
|
128
128
|
|
129
|
-
if
|
129
|
+
if %w(fswatch unison dummy).include?(watch_strategy)
|
130
130
|
watch_strategy
|
131
131
|
else
|
132
132
|
default_watch_strategy(sync_config)
|
@@ -136,7 +136,7 @@ module DockerSync
|
|
136
136
|
def default_sync_strategy
|
137
137
|
case true
|
138
138
|
when OS.linux? then 'native'
|
139
|
-
else '
|
139
|
+
else 'native_osx'
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
@@ -35,52 +35,17 @@ module Docker_Sync
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def run
|
39
|
-
start_container
|
40
|
-
sync
|
41
|
-
end
|
42
|
-
|
43
|
-
def watch
|
44
|
-
# nop
|
45
|
-
end
|
46
|
-
|
47
|
-
def sync
|
48
|
-
# nop
|
49
|
-
end
|
50
|
-
|
51
|
-
def expand_ignore_strings
|
52
|
-
expanded_ignore_strings = []
|
53
|
-
|
54
|
-
exclude_type = 'Name'
|
55
|
-
unless @options['sync_excludes_type'].nil?
|
56
|
-
exclude_type = @options['sync_excludes_type']
|
57
|
-
end
|
58
|
-
|
59
|
-
unless @options['sync_excludes'].nil?
|
60
|
-
expanded_ignore_strings = @options['sync_excludes'].map do |pattern|
|
61
|
-
if exclude_type == 'none'
|
62
|
-
# the ignore type like Name / Path are part of the pattern
|
63
|
-
ignore_string = "#{pattern}"
|
64
|
-
else
|
65
|
-
ignore_string = "#{exclude_type} #{pattern}"
|
66
|
-
end
|
67
|
-
"-ignore='#{ignore_string}'"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
expanded_ignore_strings
|
71
|
-
end
|
72
|
-
|
73
38
|
def start_container
|
74
|
-
say_status 'ok', 'Starting
|
39
|
+
say_status 'ok', 'Starting native_osx', :white
|
75
40
|
container_name = get_container_name
|
76
|
-
#create_volume
|
77
41
|
host_sync_src = @options['src']
|
78
42
|
volume_app_sync_name = @sync_name
|
79
43
|
env = {}
|
80
|
-
|
44
|
+
raise 'sync_user is no longer supported, since it ise no needed, use sync_userid only please', :yellow if @options.key?('sync_user')
|
81
45
|
|
82
46
|
ignore_strings = expand_ignore_strings
|
83
47
|
env['UNISON_EXCLUDES'] = ignore_strings.join(' ')
|
48
|
+
env['UNISON_SYNC_PREFER'] = sync_prefer
|
84
49
|
env['MAX_INOTIFY_WATCHES'] = @options['max_inotify_watches'] if @options.key?('max_inotify_watches')
|
85
50
|
if @options['sync_userid'] == 'from_host'
|
86
51
|
env['OWNER_UID'] = Process.uid
|
@@ -95,6 +60,7 @@ module Docker_Sync
|
|
95
60
|
exists = `docker ps --filter "status=exited" --filter "name=#{container_name}" --format "{{.Names}}" | grep '^#{container_name}$'`
|
96
61
|
if exists == ''
|
97
62
|
say_status 'ok', "creating #{container_name} container", :white if @options['verbose']
|
63
|
+
run_privileged = ''
|
98
64
|
run_privileged = '--privileged' if @options.key?('max_inotify_watches') #TODO: replace by the minimum capabilities required
|
99
65
|
cmd = "docker run -v #{volume_app_sync_name}:/app_sync -v #{host_sync_src}:/host_sync -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}"
|
100
66
|
else
|
@@ -109,26 +75,22 @@ module Docker_Sync
|
|
109
75
|
`#{cmd}` || raise('Start failed')
|
110
76
|
say_status 'ok', "starting initial sync of #{container_name}", :white if @options['verbose']
|
111
77
|
# wait until container is started, then sync:
|
112
|
-
say_status 'success', '
|
78
|
+
say_status 'success', 'Sync container started', :green
|
113
79
|
end
|
114
80
|
|
115
|
-
def
|
116
|
-
|
81
|
+
def run
|
82
|
+
start_container
|
83
|
+
sync
|
117
84
|
end
|
118
85
|
|
119
|
-
def
|
120
|
-
|
86
|
+
def watch
|
87
|
+
# nop
|
121
88
|
end
|
122
89
|
|
123
|
-
def
|
124
|
-
|
90
|
+
def sync
|
91
|
+
# nop
|
125
92
|
end
|
126
93
|
|
127
|
-
def reset_container
|
128
|
-
stop_container
|
129
|
-
`docker ps -a | grep #{get_container_name} && docker rm #{get_container_name}`
|
130
|
-
`docker volume ls -q | grep #{get_volume_name} && docker volume rm #{get_volume_name}`
|
131
|
-
end
|
132
94
|
|
133
95
|
def clean
|
134
96
|
reset_container
|
@@ -143,6 +105,64 @@ module Docker_Sync
|
|
143
105
|
puts e.message
|
144
106
|
end
|
145
107
|
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def reset_container
|
112
|
+
stop_container
|
113
|
+
`docker ps -a | grep #{get_container_name} && docker rm #{get_container_name}`
|
114
|
+
`docker volume ls -q | grep #{get_volume_name} && docker volume rm #{get_volume_name}`
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def get_container_name
|
119
|
+
return "#{@sync_name}"
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_volume_name
|
123
|
+
return @sync_name
|
124
|
+
end
|
125
|
+
|
126
|
+
def stop_container
|
127
|
+
`docker ps | grep #{get_container_name} && docker stop #{get_container_name} && docker wait #{get_container_name}`
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
# cares about conflict resolution
|
132
|
+
def sync_prefer
|
133
|
+
case @options.fetch('sync_prefer', 'default')
|
134
|
+
when 'default' then
|
135
|
+
'-prefer /host_sync' # thats our default, if nothing is set
|
136
|
+
when 'src' then
|
137
|
+
'-prefer /host_sync'
|
138
|
+
when 'dest' then
|
139
|
+
'-prefer /app_sync'
|
140
|
+
else
|
141
|
+
raise 'sync_pref can only be: src or dest, no path - path is no longer needed it abstracted'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def expand_ignore_strings
|
146
|
+
expanded_ignore_strings = []
|
147
|
+
|
148
|
+
exclude_type = 'Name'
|
149
|
+
unless @options['sync_excludes_type'].nil?
|
150
|
+
exclude_type = @options['sync_excludes_type']
|
151
|
+
end
|
152
|
+
|
153
|
+
unless @options['sync_excludes'].nil?
|
154
|
+
expanded_ignore_strings = @options['sync_excludes'].map do |pattern|
|
155
|
+
if exclude_type == 'none'
|
156
|
+
# the ignore type like Name / Path are part of the pattern
|
157
|
+
ignore_string = "#{pattern}"
|
158
|
+
else
|
159
|
+
ignore_string = "#{exclude_type} #{pattern}"
|
160
|
+
end
|
161
|
+
"-ignore='#{ignore_string}'"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
expanded_ignore_strings
|
165
|
+
end
|
146
166
|
end
|
147
167
|
end
|
148
168
|
end
|
data/tasks/sync/sync.thor
CHANGED
@@ -23,6 +23,7 @@ class Sync < Thor
|
|
23
23
|
|
24
24
|
desc 'start', 'Start all sync configurations in this project'
|
25
25
|
method_option :daemon, :aliases => '-d', :default => false, :type => :boolean, :desc => 'Run in the background'
|
26
|
+
method_option :foreground, :aliases => '-d', :default => false, :type => :boolean, :desc => 'Run in the background'
|
26
27
|
method_option :app_name, :aliases => '--name', :default => 'daemon', :type => :string, :desc => 'App name used in PID and OUTPUT file name for Daemon'
|
27
28
|
method_option :dir, :aliases => '--dir', :default => './.docker-sync', :type => :string, :desc => 'Path to PID and OUTPUT file Directory'
|
28
29
|
method_option :logd, :aliases => '--logd', :default => true, :type => :boolean, :desc => 'To log OUPUT to file on Daemon or not'
|
@@ -36,10 +37,15 @@ class Sync < Thor
|
|
36
37
|
@sync_manager = Docker_sync::SyncManager.new(config: config)
|
37
38
|
|
38
39
|
start_dir = Dir.pwd # Set start_dir variable to be equal to pre-daemonized folder, since daemonizing will change dir to '/'
|
39
|
-
|
40
|
-
|
40
|
+
|
41
|
+
if options['daemon']
|
42
|
+
puts 'WARNING: --daemon is deprecated and now the default. Just start without --daemom'
|
43
|
+
end
|
44
|
+
|
45
|
+
if options['foreground']
|
46
|
+
say_status 'note:', 'Starting in foreground mode', :white
|
41
47
|
else
|
42
|
-
|
48
|
+
daemonize
|
43
49
|
end
|
44
50
|
|
45
51
|
Dir.chdir(start_dir) do # We want run these in pre-daemonized folder/directory since provided config_path might not be full_path
|
@@ -56,16 +62,22 @@ class Sync < Thor
|
|
56
62
|
|
57
63
|
config = config_preconditions
|
58
64
|
sync_manager = Docker_sync::SyncManager.new(config: config)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
sync_manager.stop
|
66
|
+
pid_file_path="#{options['dir']}/#{options['app_name']}.pid"
|
67
|
+
if File.exist?(pid_file_path)
|
68
|
+
begin
|
69
|
+
pid = File.read("#{options['dir']}/#{options['app_name']}.pid") # Read PID from PIDFILE created by Daemons
|
70
|
+
Process.kill(:INT, -(Process.getpgid(pid.to_i))) # Send INT signal to group PID, which means INT will be sent to all sub-processes and Threads spawned by docker-sync
|
71
|
+
wait_for_process_termination(pid.to_i)
|
72
|
+
rescue Errno::ESRCH, Errno::ENOENT => e
|
73
|
+
say_status 'error', e.message, :red # Rescue incase PIDFILE does not exist or there is no process with such PID
|
74
|
+
say_status 'error', 'Check if your PIDFILE and process with such PID exists', :red
|
75
|
+
exit(69) # EX_UNAVAILABLE (see `man sysexits` or `/usr/include/sysexits.h`)
|
76
|
+
end
|
77
|
+
else
|
78
|
+
# there was no watcher started / needed, e.g. dummy. Nothing to worry about
|
68
79
|
end
|
80
|
+
|
69
81
|
end
|
70
82
|
|
71
83
|
desc 'sync', 'just sync - do not start a watcher though'
|
@@ -90,7 +102,7 @@ class Sync < Thor
|
|
90
102
|
files.each do |pid_file|
|
91
103
|
pid = File.read(pid_file).to_i
|
92
104
|
Process.kill(:INT, -(Process.getpgid(pid))) if Daemons::Pid.running?(pid)
|
93
|
-
say_status 'shutdown', 'Background
|
105
|
+
say_status 'shutdown', 'Background sync has been stopped'
|
94
106
|
end
|
95
107
|
# Remove the .docker-sync directory
|
96
108
|
FileUtils.rm_r dir if File.directory?(dir)
|