nutkins 0.10.3 → 0.11.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de316082b0b28edd1ebc742d5ec401abe2a66dbd
4
- data.tar.gz: 7f9bed97a340303f36f36f15cce9b148dccfd1b7
3
+ metadata.gz: 52cf42f9bda34623d363c0949b12a37820f19ee6
4
+ data.tar.gz: 81197095413f31fac40a8e43b9e04dff878d824b
5
5
  SHA512:
6
- metadata.gz: e99e6ebd941cbbf63c5a18afee83969a3be2c808b51e50847a09921482c7772be8d031f3da79e498d83bfa24258cc4b23500a67062946537e768a0057377e6e1
7
- data.tar.gz: 9027b483aea433b86ddb909d03872e7697575b52c4386a80b62ea0b8a9968fd3970f7d3e1c91081bd3897258e9a9df4b7b04369fb40f979d3c8d9c3a01e240b2
6
+ metadata.gz: b76082e30b1f978daed27171a39039017754c894f34795f40b15b2d1602bb6676247b42318abda039c4b473868307402264158381e0c38daf23089ed882c4c3d
7
+ data.tar.gz: 3958e780eb1148ba2a9e879848bcfca8f87f99c783a2d05495f4d5272df82bdd7fb366576e2eb65422a18da2eaaf9e0b09e820a0309a3a4b7a9932b279814305
@@ -1,3 +1,3 @@
1
1
  module Nutkins
2
- VERSION = "0.10.3"
2
+ VERSION = "0.11.0"
3
3
  end
data/lib/nutkins.rb CHANGED
@@ -30,6 +30,7 @@ module Nutkins
30
30
  @img_configs = {}
31
31
  # when an image is built true is stored against it's name to avoid building it again
32
32
  @built = {}
33
+ @etcd_running = false
33
34
  @project_root = project_dir || Dir.pwd
34
35
  cfg_path = File.join(@project_root, CONFIG_FILE_NAME)
35
36
  if File.exists? cfg_path
@@ -153,6 +154,8 @@ module Nutkins
153
154
  def run path, reuse: false, shell: false
154
155
  cfg = get_image_config path
155
156
  tag = cfg['tag']
157
+
158
+ start_etcd_container if cfg['etcd']
156
159
  create_args = []
157
160
  if shell
158
161
  raise '--shell and --reuse arguments are incompatible' if reuse
@@ -237,11 +240,14 @@ module Nutkins
237
240
  puts "TODO: exec #{path}: #{cmd.join ' '}"
238
241
  end
239
242
 
240
- # TODO: move this stuff into another file
241
243
  def start_etcd_container
244
+ return if @etcd_running
245
+ # TODO: move this stuff into another file
242
246
  name = get_etcd_container_name
243
247
  return unless name
244
248
 
249
+ # TODO: update existing etcd server rather than creating new container...
250
+ # this will let confd instances respond to updates
245
251
  existing = Docker.container_id_for_name name
246
252
  if existing
247
253
  Docker.run 'stop', name
@@ -298,6 +304,7 @@ module Nutkins
298
304
  puts res
299
305
  end
300
306
  end
307
+ @etcd_running = true
301
308
  else
302
309
  puts 'failed to start etcd container'
303
310
  end
@@ -319,10 +326,7 @@ module Nutkins
319
326
  end
320
327
 
321
328
  private
322
- def get_etcd_container_name
323
- repository = @config.repository
324
- repository && "nutkins-etcd-#{repository}"
325
- end
329
+ def get_etcd_container_name; "nutkins-etcd"; end
326
330
 
327
331
  # path should be "." or a single element path referencing the project root
328
332
  def get_image_config path
data/readme.md ADDED
@@ -0,0 +1,169 @@
1
+ # Nutkins
2
+
3
+ [![build status](https://circleci.com/gh/ohjames/nutkins.png)](https://circleci.com/gh/ohjames/nutkins)
4
+
5
+ nutkins provides a way to build and test clusters based on one or more containers.
6
+ * A easier and more flexible way to build docker images than `Dockerfile`.
7
+ * Can run multiple commands to build a layer with comments for each.
8
+ * No need for `.dockerignore`.
9
+ * Caches each command in a layer and rebuilds from cache in a fraction of a second.
10
+ * Test services that use multiple containers without having to use VMs.
11
+ * Support for etcd/environment variables and confd.
12
+ * nutkins can manage a local etcd server and its data to test confd configurations.
13
+ * nutkins can manage a confd configuration using a sensible convention-over-configuration approach.
14
+ * Manages secrets encrypted with gpg.
15
+
16
+ nutkins works great with:
17
+ * [etcd](https://github.com/coreos/etcd) - a distributed key-value data store.
18
+ * [confd](https://github.com/kelseyhightower/confd) - a system for building configuration files from data stored using `etcd` (and other data stores).
19
+ * [smell-baron](https://github.com/ohjames/smell-baron) - an init system for docker containers
20
+
21
+ ## installation
22
+
23
+ ```bash
24
+ gem install nutkins
25
+ ```
26
+
27
+ ## configuring nutkins
28
+
29
+ ### The project root
30
+
31
+ In the project root there should be a `nutkins.yaml` which may contain global configuration:
32
+
33
+ ```yaml
34
+ version: 0.0.1
35
+ repository: myorg
36
+ ```
37
+
38
+ With this configuration each built image will be tagged `myorg/${image_name}:0.0.1` where `0.0.1` may also be overridden per image.
39
+
40
+ For projects that consist of a single `nutkin.yaml` in the project root then `nutkins.yaml` may be omitted and these fields should be present in the `nutkin.yaml`.
41
+
42
+ ### Images
43
+
44
+ Each subdirectory in the project root that contains a file `nutkin.yaml` is used to build a docker image. The following project contains an image in a subdirectory `base` that extends the `ubuntu:16.04` container hosted on docker hub:
45
+
46
+ ```yaml
47
+ base: ubuntu:16.04
48
+
49
+ build:
50
+ resources:
51
+ -
52
+ source: https://github.com/ohjames/smell-baron/releases/download/v0.3.1/smell-baron
53
+ dest: bin/smell-baron
54
+ mode: 0755
55
+ -
56
+ source: https://github.com/kelseyhightower/confd/releases/download/v0.12.0-alpha3/confd-0.12.0-alpha3-linux-amd64
57
+ dest: bin/confd
58
+ mode: 0755
59
+ -
60
+ source: https://github.com/coreos/etcd/releases/download/v3.0.6/etcd-v3.0.6-linux-amd64.tar.gz
61
+ extract: "*/etcdctl"
62
+ dest: bin/etcdctl
63
+ mode: 0755
64
+ commands:
65
+ - run:
66
+ - apt-get update
67
+ - apt-get install -y vim zsh less nano rsync git net-tools
68
+ - groupadd -g 5496 sslcerts
69
+ - add: bin/* /bin/
70
+ - entrypoint: ["/bin/smell-baron"]
71
+ ```
72
+
73
+ The `resources` section downloads files to local directories so that they can be used in the image. In the case of `confd` it also extracts a file from a `tar.gz` compressed archive.
74
+
75
+ The `commands` section is like a `Dockerfile` and is used to build a container. In this case it runs multiple commands, add some files to the image and sets an `entrypoint`. This image would be tagged `myorg/base:0.0.1`. The image name comes from the subdirectory but can be overriden along with the `version`:
76
+
77
+ ```yaml
78
+ base: ubuntu:16.04
79
+ image: base_image
80
+ version: 0.0.2
81
+ build:
82
+ # ... as before
83
+ ```
84
+
85
+ To build this image:
86
+ ```bash
87
+ nutkins build base
88
+ ```
89
+
90
+ This will output various information as it builds the image. If the same command is run again it will reuse data from the cache, exiting in less than a second:
91
+
92
+ ```bash
93
+ % nutkins build base
94
+ cached: apt-get update && apt-get install -y vim zsh less nano rsync git net-tools && groupadd -g 5496 sslcerts
95
+ cached: #(nop) add bin/confd:33472f6b8f9522ec7bdb01a8feeb03fb bin/etcdctl:8edfaac7c726e8231c6e0e8f75ffb678 bin/smell-baron:909345dcbc4a029d42f39278486a32b9 /bin/
96
+ cached: #(nop) entrypoint ["/bin/smell-baron"]
97
+ unchanged image: myorg/base:0.0.1
98
+ ```
99
+
100
+ To run a container from this image (this first rebuilds the image):
101
+ ```bash
102
+ nutkins run base
103
+ ```
104
+
105
+ To run a container from this image and open an interactive shell (this only works if the `entrypoint` is [smell-baron](https://github.com/ohjames/smell-baron)):
106
+ ```bash
107
+ nutkins run -s base
108
+ ```
109
+
110
+ ### Image project dependencies
111
+
112
+ When a `nutkin.yaml` file refers to a `base` image that exists in the current project then `nutkins` ensures the base image is up to date before any images are built that use or extend it.
113
+
114
+ ### Sharing local data with images
115
+
116
+ When using `nutkins` to test images it can be useful to share data in the host system with the running containers:
117
+
118
+ ```yaml
119
+ base: base
120
+
121
+ build:
122
+ commands:
123
+ # ... build commands go here
124
+ create:
125
+ volumes:
126
+ - ssl -> /etc/ssl
127
+ - ejabberd-etc -> /tmp/ejabberd-etc
128
+ - ejabberd-var -> /var/lib/ejabberd
129
+ ```
130
+
131
+ If `nutkins.yaml` is in the directory `subdir` the volume `ssl` will be searched for first in `subdir/volumes/ssl` and then `volumes/ssl`.
132
+
133
+ ### Sharing ports with the host operating system
134
+
135
+ ```yaml
136
+ create:
137
+ ports:
138
+ - 5222
139
+ - 5269
140
+ ```
141
+
142
+ ### Testing images configured with etcd
143
+
144
+ The following `nutkin.yaml` shows how to manage a local `etcd` cluster:
145
+
146
+ ```yaml
147
+ base: base
148
+
149
+ build:
150
+ commands:
151
+ # ... as before
152
+ create:
153
+ # ... as before
154
+ etcd:
155
+ data:
156
+ ejabberd/node_name: ejabberd@myhost
157
+ ejabberd/hostname: myhost.net
158
+ ejabberd/muc_host: c.@HOST@
159
+ ```
160
+
161
+ When running a container that has etcd data `nutkins` will first start up a helper container running `etcd` and use it to serve the etcd data from every `nutkin.yaml` in the project. To access this `etcd` data from within the container:
162
+
163
+ ```bash
164
+ etcd2_host=$(ip route | grep '^default' | cut -d' ' -f3)
165
+ # use confd to build the configuration files from the data stored in etcd
166
+ confd -onetime -backend etcd -node http://$etcd_host:2379
167
+ ```
168
+
169
+ The same command will work within a CoreOS cluster or any other etcd backed cluster.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nutkins
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Pike
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-27 00:00:00.000000000 Z
11
+ date: 2016-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -78,7 +78,6 @@ files:
78
78
  - ".rspec"
79
79
  - ".travis.yml"
80
80
  - Gemfile
81
- - README.md
82
81
  - Rakefile
83
82
  - bin/console
84
83
  - bin/nutkins
@@ -91,6 +90,7 @@ files:
91
90
  - lib/nutkins/download.rb
92
91
  - lib/nutkins/version.rb
93
92
  - nutkins.gemspec
93
+ - readme.md
94
94
  homepage: http://github.com/ohjames/nutkins
95
95
  licenses: []
96
96
  metadata:
data/README.md DELETED
@@ -1,7 +0,0 @@
1
- # Nutkins
2
-
3
- [![build status](https://circleci.com/gh/ohjames/nutkins.png)](https://circleci.com/gh/ohjames/nutkins)
4
-
5
- Nutkins is a tool to help build and test multiple docker containers configured via etcd and confd. You can:
6
- * Describe test volumes and etcd variables using yaml.
7
- * Easily rebuild and test containers with a few simple commands.