docker-template 0.2.0 → 0.3.0
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/Gemfile +30 -4
- data/LICENSE +1 -1
- data/README.md +79 -14
- data/Rakefile +115 -38
- data/bin/docker-template +24 -10
- data/comp/bin +9 -0
- data/comp/list +83 -0
- data/comp/list.pak +0 -0
- data/lib/docker/template.rb +47 -61
- data/lib/docker/template/builder.rb +302 -0
- data/lib/docker/template/cache.rb +71 -0
- data/lib/docker/template/cli.rb +125 -0
- data/lib/docker/template/error.rb +120 -11
- data/lib/docker/template/logger.rb +128 -0
- data/lib/docker/template/metadata.rb +566 -103
- data/lib/docker/template/normal.rb +46 -0
- data/lib/docker/template/notify.rb +44 -0
- data/lib/docker/template/parser.rb +48 -38
- data/lib/docker/template/repo.rb +131 -97
- data/lib/docker/template/rootfs.rb +51 -41
- data/lib/docker/template/scratch.rb +96 -66
- data/lib/docker/template/version.rb +4 -2
- data/lib/erb/context.rb +29 -0
- data/shas.yml +11 -0
- data/templates/rootfs.erb +5 -0
- data/templates/rootfs/alpine.erb +71 -0
- data/templates/rootfs/ubuntu.erb +76 -0
- data/{lib/docker/template/templates → templates}/scratch.erb +0 -1
- metadata +64 -50
- data/lib/docker/template/alias.rb +0 -28
- data/lib/docker/template/ansi.rb +0 -85
- data/lib/docker/template/auth.rb +0 -25
- data/lib/docker/template/common.rb +0 -130
- data/lib/docker/template/config.rb +0 -80
- data/lib/docker/template/error/bad_exit_status.rb +0 -17
- data/lib/docker/template/error/bad_repo_name.rb +0 -15
- data/lib/docker/template/error/invalid_repo_type.rb +0 -16
- data/lib/docker/template/error/invalid_targz_file.rb +0 -15
- data/lib/docker/template/error/no_rootfs_copy_dir.rb +0 -15
- data/lib/docker/template/error/no_rootfs_mkimg.rb +0 -15
- data/lib/docker/template/error/no_setup_context_found.rb +0 -15
- data/lib/docker/template/error/not_implemented.rb +0 -15
- data/lib/docker/template/error/repo_not_found.rb +0 -16
- data/lib/docker/template/interface.rb +0 -118
- data/lib/docker/template/patches.rb +0 -9
- data/lib/docker/template/patches/array.rb +0 -11
- data/lib/docker/template/patches/hash.rb +0 -71
- data/lib/docker/template/patches/object.rb +0 -9
- data/lib/docker/template/patches/pathname.rb +0 -46
- data/lib/docker/template/patches/string.rb +0 -9
- data/lib/docker/template/routable.rb +0 -28
- data/lib/docker/template/simple.rb +0 -49
- data/lib/docker/template/stream.rb +0 -63
- data/lib/docker/template/templates/rootfs.erb +0 -8
- data/lib/docker/template/util.rb +0 -54
- data/lib/docker/template/util/copy.rb +0 -77
- data/lib/docker/template/util/data.rb +0 -26
@@ -1,22 +1,15 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2015 Jordon Bedwell - Apache v2.0 License
|
3
|
+
# Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
module Docker
|
6
8
|
module Template
|
7
|
-
class Rootfs <
|
8
|
-
|
9
|
-
def initialize(repo)
|
10
|
-
@repo = repo
|
11
|
-
end
|
12
|
-
|
13
|
-
#
|
9
|
+
class Rootfs < Builder
|
10
|
+
extend Forwardable::Extended
|
14
11
|
|
15
|
-
|
16
|
-
true
|
17
|
-
end
|
18
|
-
|
19
|
-
#
|
12
|
+
# ----------------------------------------------------------------------
|
20
13
|
|
21
14
|
def data
|
22
15
|
Template.get(:rootfs, {
|
@@ -24,50 +17,67 @@ module Docker
|
|
24
17
|
})
|
25
18
|
end
|
26
19
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
# ----------------------------------------------------------------------
|
21
|
+
|
22
|
+
def builder_data
|
23
|
+
tpl = "rootfs/#{@repo.metadata.rootfs_template}"
|
24
|
+
erb = @repo.root.join("rootfs.erb")
|
25
|
+
|
26
|
+
Template.get(
|
27
|
+
erb.file?? erb : tpl, {
|
28
|
+
:metadata => @repo.metadata
|
29
|
+
}
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
# ----------------------------------------------------------------------
|
34
|
+
# During a simple copy you store all the data (including rootfs) data
|
35
|
+
# as a single unit, this helps us clean up data that is known to be for
|
36
|
+
# just the rootfs image and remove it so it doesn't impact.
|
37
|
+
# ----------------------------------------------------------------------
|
38
|
+
|
39
|
+
def simple_cleanup(dir)
|
40
|
+
file = dir.join("usr/local/bin/mkimg")
|
41
|
+
|
42
|
+
if file.exist?
|
43
|
+
then file.delete
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# ----------------------------------------------------------------------
|
33
48
|
|
34
|
-
def
|
35
|
-
keep = @repo.metadata["keep_rootfs"]
|
36
|
-
@img.delete "force" => true if img && @img && !keep
|
49
|
+
def teardown(img: true)
|
37
50
|
@context.rmtree if @context && @context.directory?
|
38
|
-
|
39
|
-
|
51
|
+
@img.delete "force" => true if @img && img \
|
52
|
+
rescue nil
|
40
53
|
end
|
41
54
|
|
42
|
-
#
|
55
|
+
# ----------------------------------------------------------------------
|
43
56
|
|
44
57
|
private
|
45
58
|
def setup_context
|
46
59
|
@context = @repo.tmpdir("rootfs")
|
47
|
-
@context.join("Dockerfile").write(data)
|
48
60
|
@copy = @context.join(@repo.metadata["copy_dir"])
|
49
|
-
@
|
61
|
+
@context.join("Dockerfile").write(data)
|
62
|
+
|
63
|
+
@copy.join("usr/local/bin").mkdir_p
|
64
|
+
@copy.join("usr/local/bin/mkimg").write(builder_data)
|
65
|
+
@copy.join("usr/local/bin/mkimg").chmod(0755)
|
50
66
|
copy_rootfs
|
51
67
|
end
|
52
68
|
|
53
|
-
#
|
69
|
+
# ----------------------------------------------------------------------
|
54
70
|
|
55
71
|
private
|
56
72
|
def copy_rootfs
|
57
|
-
dir = @repo.copy_dir(
|
58
|
-
|
59
|
-
|
60
|
-
if error_.message !~ /\/(copy|rootfs)\Z/
|
61
|
-
raise error_ else raise Error::NoRootfsCopyDir
|
62
|
-
end
|
63
|
-
end
|
73
|
+
dir = @repo.copy_dir(
|
74
|
+
"rootfs"
|
75
|
+
)
|
64
76
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
unless @copy.join("usr/local/bin/mkimg").file?
|
70
|
-
raise Error::NoRootfsMkimg
|
77
|
+
if dir.exist?
|
78
|
+
@repo.copy_dir("rootfs").safe_copy(@copy, {
|
79
|
+
:root => Template.root
|
80
|
+
})
|
71
81
|
end
|
72
82
|
end
|
73
83
|
end
|
@@ -1,35 +1,49 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2015 Jordon Bedwell - Apache v2.0 License
|
3
|
+
# Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
module Docker
|
6
8
|
module Template
|
7
|
-
class Scratch <
|
8
|
-
attr_reader :rootfs
|
9
|
-
|
10
|
-
|
9
|
+
class Scratch < Builder
|
10
|
+
attr_reader :rootfs
|
11
|
+
|
12
|
+
# ----------------------------------------------------------------------
|
13
|
+
|
14
|
+
def initialize(*args)
|
15
|
+
super; @rootfs = Rootfs.new(
|
16
|
+
repo
|
17
|
+
)
|
11
18
|
end
|
12
19
|
|
13
|
-
#
|
20
|
+
# ----------------------------------------------------------------------
|
14
21
|
|
15
22
|
def data
|
16
23
|
Template.get(:scratch, {
|
17
|
-
:
|
18
|
-
:
|
24
|
+
:entrypoint => @repo.metadata.entry,
|
25
|
+
:maintainer => @repo.metadata.maintainer,
|
19
26
|
:tar_gz => @tar_gz.basename
|
20
27
|
})
|
21
28
|
end
|
22
29
|
|
23
|
-
#
|
30
|
+
# ----------------------------------------------------------------------
|
31
|
+
|
32
|
+
def teardown(img: false)
|
33
|
+
@copy.rm_rf if @copy
|
34
|
+
@context.rm_rf if @context
|
35
|
+
@tar_gz.rm_rf if @tar_gz
|
24
36
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
if @img && img
|
38
|
+
then @img.delete({
|
39
|
+
"force" => true
|
40
|
+
})
|
41
|
+
end
|
42
|
+
rescue Docker::Error::NotFoundError
|
43
|
+
nil
|
30
44
|
end
|
31
45
|
|
32
|
-
#
|
46
|
+
# ----------------------------------------------------------------------
|
33
47
|
|
34
48
|
private
|
35
49
|
def setup_context
|
@@ -39,96 +53,112 @@ module Docker
|
|
39
53
|
copy_dockerfile
|
40
54
|
end
|
41
55
|
|
42
|
-
#
|
56
|
+
# ----------------------------------------------------------------------
|
43
57
|
|
44
58
|
private
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
|
59
|
+
def copy_dockerfile
|
60
|
+
data = self.data % @tar_gz.basename
|
61
|
+
dockerfile = @context.join("Dockerfile")
|
62
|
+
dockerfile.write(data)
|
49
63
|
end
|
50
64
|
|
51
|
-
#
|
52
|
-
# on the class because it could be used many times in a single build
|
53
|
-
# so we make sure to keep it around so you don't have tons of
|
54
|
-
# replication going about slowing down all of the builds.
|
65
|
+
# ----------------------------------------------------------------------
|
55
66
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
67
|
+
def copy_cleanup
|
68
|
+
@rootfs.simple_cleanup(
|
69
|
+
@copy
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
# ----------------------------------------------------------------------
|
74
|
+
|
75
|
+
def verify_context
|
76
|
+
if @repo.buildable? && @tar_gz.zero?
|
77
|
+
raise Error::InvalidTargzFile, @tar_gz
|
59
78
|
end
|
60
79
|
end
|
61
80
|
|
62
|
-
#
|
81
|
+
# ----------------------------------------------------------------------
|
63
82
|
|
64
83
|
private
|
65
84
|
def build_context
|
66
|
-
|
85
|
+
return unless @repo.buildable?
|
86
|
+
@rootfs.build
|
67
87
|
|
68
|
-
output_given = false
|
69
88
|
img = Container.create(create_args)
|
70
|
-
img.start(start_args).attach
|
71
|
-
|
72
|
-
output_given = true
|
73
|
-
end
|
89
|
+
img.start(start_args).attach(logger_opts, &Logger.new.method(logger_type))
|
90
|
+
status = img.json["State"]["ExitCode"]
|
74
91
|
|
75
|
-
|
76
|
-
# work, through the remote API, so we need to detect those situations
|
77
|
-
# and stream the logs after it's exited if we have given no output,
|
78
|
-
# we want you to always get the output that was given.
|
79
|
-
|
80
|
-
unless output_given
|
81
|
-
img.streaming_logs "stdout" => true, "stderr" => true do |type, str|
|
82
|
-
type == :stdout ? $stdout.print(str) : $stderr.print(Ansi.red(str))
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
if (status = img.json["State"]["ExitCode"]) != 0
|
92
|
+
if status != 0
|
87
93
|
raise Error::BadExitStatus, status
|
88
94
|
end
|
89
95
|
ensure
|
90
|
-
|
96
|
+
@rootfs.teardown
|
97
|
+
|
98
|
+
if img
|
99
|
+
then img.tap(&:stop).delete({
|
100
|
+
"force" => true
|
101
|
+
})
|
102
|
+
end
|
91
103
|
end
|
92
104
|
|
93
|
-
#
|
105
|
+
# ----------------------------------------------------------------------
|
94
106
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
107
|
+
private
|
108
|
+
def logger_type
|
109
|
+
@repo.metadata["tty"] ? :tty : :simple
|
99
110
|
end
|
100
111
|
|
101
|
-
#
|
112
|
+
# ----------------------------------------------------------------------
|
102
113
|
|
103
114
|
private
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
|
115
|
+
def logger_opts
|
116
|
+
return {
|
117
|
+
:tty => @repo.metadata["tty"], :stdout => true, :stderr => true
|
118
|
+
}
|
108
119
|
end
|
109
120
|
|
110
|
-
#
|
121
|
+
# ----------------------------------------------------------------------
|
111
122
|
|
112
123
|
private
|
113
124
|
def create_args
|
114
|
-
|
115
|
-
|
116
|
-
|
125
|
+
name = ["rootfs", @repo.name, @repo.tag, "image"].join("-")
|
126
|
+
env = @repo.to_env(:tar_gz => @tar_gz, :copy_dir => @copy)
|
127
|
+
|
128
|
+
return {
|
129
|
+
"Env" => env.to_a,
|
130
|
+
"Tty" => @repo.metadata["tty"],
|
117
131
|
"Image" => @rootfs.img.id,
|
132
|
+
"Name" => name,
|
133
|
+
|
134
|
+
"HostConfig" => {
|
135
|
+
"Binds" => [
|
136
|
+
"#{@copy}:#{@copy}", "#{@tar_gz}:#{@tar_gz}"
|
137
|
+
]
|
138
|
+
},
|
139
|
+
|
118
140
|
"Volumes" => {
|
119
|
-
@
|
141
|
+
@copy.to_s => {
|
142
|
+
"source" => @copy.to_s,
|
143
|
+
"destination" => @copy.to_s
|
144
|
+
},
|
145
|
+
|
146
|
+
@tar_gz.to_s => {
|
147
|
+
"source" => @tar_gz.to_s,
|
148
|
+
"destination" => @tar_gz.to_s
|
149
|
+
}
|
120
150
|
}
|
121
151
|
}
|
122
152
|
end
|
123
153
|
|
124
|
-
#
|
154
|
+
# ----------------------------------------------------------------------
|
125
155
|
|
126
156
|
private
|
127
157
|
def start_args
|
128
158
|
{
|
129
|
-
"Binds" => [
|
130
|
-
|
131
|
-
]
|
159
|
+
# "Binds" => [
|
160
|
+
# "#{@copy}:#{@copy}", "#{@tar_gz}:#{@tar_gz}"
|
161
|
+
# ]
|
132
162
|
}
|
133
163
|
end
|
134
164
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
1
2
|
# Frozen-string-literal: true
|
2
|
-
# Copyright: 2015 Jordon Bedwell - Apache v2.0 License
|
3
|
+
# Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
|
3
4
|
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
4
6
|
|
5
7
|
module Docker
|
6
8
|
module Template
|
7
|
-
VERSION = "0.
|
9
|
+
VERSION = "0.3.0"
|
8
10
|
end
|
9
11
|
end
|
data/lib/erb/context.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2015 - 2016 Jordon Bedwell - Apache v2.0 License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
require "erb"
|
8
|
+
class ERB
|
9
|
+
class Context
|
10
|
+
|
11
|
+
# ------------------------------------------------------------------------
|
12
|
+
# Wraps any data you wish to send to ERB limiting it's context access.
|
13
|
+
# ------------------------------------------------------------------------
|
14
|
+
|
15
|
+
def initialize(vars)
|
16
|
+
vars.each do |key, val|
|
17
|
+
instance_variable_set("@#{key}", val)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# ------------------------------------------------------------------------
|
22
|
+
# Returns the binding so that we can ship it off and give it to ERB.
|
23
|
+
# ------------------------------------------------------------------------
|
24
|
+
|
25
|
+
def _binding
|
26
|
+
return binding
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/shas.yml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
alpine:
|
2
|
+
apk_tools:
|
3
|
+
3.3: { package: apk-tools-static-2.6.5-r1.apk, sha: 03162d70e6d42eea77624a8da76d69e665ca19aa834361c3652414f111884636 }
|
4
|
+
3.2: { package: apk-tools-static-2.6.3-r0.apk, sha: ee5f42e06731c7447ce8fae99116a637f261e24f67826ca81dbe60ffbdb5c40e }
|
5
|
+
|
6
|
+
apk_keys:
|
7
|
+
3.3: { package: alpine-keys-1.1-r0.apk, sha: bd1f365f1dbda97e02fceb86fe4ff7e220f31ecc9debfd2a0c43764b45d31d0e }
|
8
|
+
3.2: { package: alpine-keys-1.1-r0.apk, sha: 26e9296d789fd4cae7392a067bed480b502d4302bcb7289d699af42c100622eb }
|
9
|
+
|
10
|
+
ubuntu:
|
11
|
+
signing_key_sha: ""
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
[ "$DEBUG" ] && set -x
|
3
|
+
set -e
|
4
|
+
|
5
|
+
arch=$(uname -i)
|
6
|
+
rootfs=$(mktemp -d)
|
7
|
+
tmp=$(mktemp -d)
|
8
|
+
|
9
|
+
mirrors="\nhttp://dl-1.alpinelinux.org/alpine/v<%= @metadata.release %>/main"
|
10
|
+
mirrors=$mirrors"\nhttp://dl-2.alpinelinux.org/alpine/v<%= @metadata.release %>/main"
|
11
|
+
mirrors=$mirrors"\n@testing http://dl-3.alpinelinux.org/alpine/edge/testing"
|
12
|
+
mirrors=$mirrors"\n@testing http://dl-4.alpinelinux.org/alpine/edge/testing"
|
13
|
+
release_url="http://nl.alpinelinux.org/alpine/v<%= @metadata.release %>/main"
|
14
|
+
testing_url="http://nl.alpinelinux.org/alpine/edge/testing"
|
15
|
+
|
16
|
+
tar_ignore() {
|
17
|
+
sed -r "/tar: Ignoring unknown extended header/d"
|
18
|
+
}
|
19
|
+
|
20
|
+
apt-get update && apt-get install --no-install-recommends -y wget
|
21
|
+
<% sha1 = @metadata._shas[:alpine][:apk_keys ][@metadata.tag].sha %>
|
22
|
+
<% pkg1 = @metadata._shas[:alpine][:apk_keys ][@metadata.tag].package %>
|
23
|
+
<% pkg2 = @metadata._shas[:alpine][:apk_tools][@metadata.tag].package %>
|
24
|
+
<% sha2 = @metadata._shas[:alpine][:apk_tools][@metadata.tag].sha %>
|
25
|
+
for v in <%= sha1 %>:<%= pkg1 %> <%= sha2 %>:<%= pkg2 %>; do
|
26
|
+
sha=$(echo $v | awk -F: '{ print $1 }')
|
27
|
+
pkg=$(echo $v | awk -F: '{ print $2 }')
|
28
|
+
wget -nv -O $tmp/$pkg $release_url/$arch/$pkg
|
29
|
+
if [ "$(sha256sum $tmp/$pkg)" != "$sha $tmp/$pkg" ]; then
|
30
|
+
>&2 printf "%s sha error: %s" $pkg \
|
31
|
+
"$(sha256sum $tmp/$pkg)"
|
32
|
+
exit 1
|
33
|
+
fi
|
34
|
+
done
|
35
|
+
|
36
|
+
tar xzf $tmp/alpine-keys-*.apk -C $tmp etc/ 2>&1 | tar_ignore
|
37
|
+
tar xzf $tmp/apk-tools-static-*.apk -C $tmp sbin/apk.static 2>&1 | tar_ignore
|
38
|
+
$tmp/sbin/apk.static --keys-dir=$tmp/etc/apk/keys --initdb --root=$rootfs \
|
39
|
+
--repository=$release_url --update-cache add apk-tools busybox \
|
40
|
+
libc-utils alpine-baselayout alpine-keys musl
|
41
|
+
|
42
|
+
cd $tmp
|
43
|
+
$tmp/sbin/apk.static --keys-dir=$tmp/etc/apk/keys --root=$rootfs --repository=$release_url --update fetch alpine-base
|
44
|
+
tar xzf $tmp/alpine-base-*.apk -C $rootfs etc/ 2>&1 | tar_ignore
|
45
|
+
cd -> /dev/null
|
46
|
+
|
47
|
+
cp -R $COPY_DIR/* $rootfs 2> /dev/null || true
|
48
|
+
mkdir -p $rootfs/etc/startup1.d
|
49
|
+
mkdir -p $rootfs/etc/startup2.d
|
50
|
+
mkdir -p $rootfs/etc/startup3.d
|
51
|
+
mkdir -p $rootfs/etc/shutdown.d
|
52
|
+
|
53
|
+
cp /etc/hosts $rootfs/etc/hosts
|
54
|
+
cp /etc/resolv.conf $rootfs/etc/resolv.conf
|
55
|
+
printf "$mirrors" > $rootfs/etc/apk/repositories
|
56
|
+
<% if @metadata.pkgs? %>chroot $rootfs sh -ec "apk --update add <%= @metadata.pkgs %>"<% end %>
|
57
|
+
<% if @metadata.packages? %>chroot $rootfs sh -ec "apk --update add <%= @metadata.packages %>"<% end %>
|
58
|
+
<% if @metadata.package_cleanup? %>chroot $rootfs sh -ec "apk del <%= @metadata.package_cleanup %>"<% end %>
|
59
|
+
<% if @metadata.pkg_cleanup? %>chroot $rootfs sh -ec "apk del <%= @metadata.pkg_cleanup %>"<% end %>
|
60
|
+
chroot $rootfs sh -ec '{
|
61
|
+
mv /var/run/* /run 2> /dev/null || true
|
62
|
+
mv /var/lock /run 2> /dev/null || true
|
63
|
+
rm -rf /var/run /var/lock
|
64
|
+
ln -s /run/lock /var/lock
|
65
|
+
ln -s /run /var/run
|
66
|
+
}'
|
67
|
+
|
68
|
+
rm -rf $rootfs/etc/hosts
|
69
|
+
rm -rf $rootfs/etc/resolv.conf
|
70
|
+
docker-helper cleanup $rootfs
|
71
|
+
tar -zf $TAR_GZ --numeric-owner -C $rootfs -c .
|