ddsl 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc50eec07295a16c3ecd6a8be51092c807574804
4
- data.tar.gz: 5d752cc123531436e14ac1697638826a6dc38e9e
3
+ metadata.gz: cbf0d40e7957eb4db36772b305282892b5084f2c
4
+ data.tar.gz: 447843b863036959416cb10ab4ced57da3fd70c2
5
5
  SHA512:
6
- metadata.gz: a37dc864649a554971209c92280934618c8140fc8f9b8dbe67153078aaccf6d889c55de6a04f11808835f6d5ca30a65ded1c5de026b4df651ca1e76a0c064e01
7
- data.tar.gz: eda8481c21285581092ccafba56b4c8d0bb18143fb3940ced1931b3dcf01630218b78252b84bf21bd1b209096f1fa192baa27b0a33e7011232cef36009de93e7
6
+ metadata.gz: e879a19bda67f10c326dd8155f3637c7630e8bb05a8728bd27d931878bcd0eb7aff0480d688b5c11ad4e883bc01ecd2b3dd1c8f4f861e63af8c81ad89d7a3a5e
7
+ data.tar.gz: 4296bae73cb2db3525c66e591c315b09685f78aec50234c8ba6db06db2bd567d59fd9ec311b7e5fb6a189a2344eb6b0d170e5be706e14b41b7d135406ded7673
@@ -23,8 +23,6 @@ jobs:
23
23
  steps:
24
24
  - checkout
25
25
  - setup_remote_docker
26
- - run:
27
- command: echo "$DOCKER_REGISTRY_PASSWORD" | docker login --username $DOCKER_REGISTRY_USERNAME --password-stdin
28
26
  - run:
29
27
  command: |
30
28
  export CI_SHA1=circleci-$CIRCLE_SHA1
@@ -34,8 +32,6 @@ jobs:
34
32
  steps:
35
33
  - checkout
36
34
  - setup_remote_docker
37
- - run:
38
- command: echo "$DOCKER_REGISTRY_PASSWORD" | docker login --username $DOCKER_REGISTRY_USERNAME --password-stdin
39
35
  - run:
40
36
  command: |
41
37
  export CI_SHA1=circleci-$CIRCLE_SHA1
@@ -45,8 +41,6 @@ jobs:
45
41
  steps:
46
42
  - checkout
47
43
  - setup_remote_docker
48
- - run:
49
- command: echo "$DOCKER_REGISTRY_PASSWORD" | docker login --username $DOCKER_REGISTRY_USERNAME --password-stdin
50
44
  - run:
51
45
  command: |
52
46
  export CI_SHA1=circleci-$CIRCLE_SHA1
data/.ddsl.yml CHANGED
@@ -1,5 +1,11 @@
1
1
  version: 1
2
2
 
3
+ registries:
4
+ - url: docker.io
5
+ username: $DOCKER_REGISTRY_USERNAME
6
+ password: $DOCKER_REGISTRY_PASSWORD
7
+ use_cache: true
8
+
3
9
  builds:
4
10
  - name: feature-branch
5
11
  type: docker
@@ -34,14 +40,14 @@ runs:
34
40
  type: docker
35
41
  image: bilby91/ddsl:$CI_SHA1
36
42
  cmd: bundle exec rspec spec
37
- - name: test
38
- type: docker
39
- image: bilby91/ddsl:latest
40
- cmd: bundle exec rspec spec
41
43
  - name: lint-ci
42
44
  type: docker
43
45
  image: bilby91/ddsl:$CI_SHA1
44
46
  cmd: rubocop .
47
+ - name: test
48
+ type: docker
49
+ image: bilby91/ddsl:latest
50
+ cmd: bundle exec rspec spec
45
51
  - name: lint
46
52
  type: docker
47
53
  image: bilby91/ddsl:latest
@@ -10,7 +10,6 @@ stages:
10
10
  - build
11
11
  - checks
12
12
  before_script:
13
- - echo $DOCKER_REGISTRY_PASSWORD | docker login -u "$DOCKER_REGISTRY_USERNAME" --password-stdin
14
13
  - export CI_SHA1=gitlab-$CI_COMMIT_SHA
15
14
  build:
16
15
  stage: build
@@ -7,7 +7,7 @@ services:
7
7
 
8
8
  env:
9
9
  global:
10
- - DDSL_VERSION=0.0.2
10
+ - DDSL_VERSION=0.0.3
11
11
  - DOCKER_COMPOSE_VERSION=1.23.1
12
12
 
13
13
  stages:
@@ -19,7 +19,6 @@ before_install:
19
19
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
20
20
  - chmod +x docker-compose
21
21
  - sudo mv docker-compose /usr/local/bin
22
- - docker login -u "$DOCKER_REGISTRY_USERNAME" -p "$DOCKER_REGISTRY_PASSWORD"
23
22
  - export CI_SHA1=travis-$TRAVIS_COMMIT
24
23
 
25
24
  install: gem install ddsl --version=$DDSL_VERSION
@@ -1,31 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ddsl (0.0.2)
4
+ ddsl (0.0.4)
5
5
  clamp (~> 1)
6
6
  json (~> 2)
7
- json-schema (~> 2)
7
+ json_schemer (~> 0.1)
8
8
  transproc (~> 1)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- addressable (2.5.2)
14
- public_suffix (>= 2.0.2, < 4.0)
15
13
  ast (2.4.0)
16
14
  clamp (1.3.0)
17
15
  diff-lcs (1.3)
18
16
  docile (1.3.1)
17
+ ecma-re-validator (0.2.0)
18
+ regexp_parser (~> 1.2)
19
+ hana (1.3.4)
19
20
  jaro_winkler (1.5.1)
20
21
  json (2.1.0)
21
- json-schema (2.8.1)
22
- addressable (>= 2.4)
22
+ json_schemer (0.1.9)
23
+ ecma-re-validator (~> 0.2.0)
24
+ hana (~> 1.3.3)
25
+ regexp_parser (~> 1.2.0)
26
+ uri_template (~> 0.7.0)
23
27
  parallel (1.12.1)
24
28
  parser (2.5.3.0)
25
29
  ast (~> 2.4.0)
26
30
  powerpack (0.1.2)
27
- public_suffix (3.0.3)
28
31
  rainbow (3.0.0)
32
+ regexp_parser (1.2.0)
29
33
  rspec (3.8.0)
30
34
  rspec-core (~> 3.8.0)
31
35
  rspec-expectations (~> 3.8.0)
@@ -53,8 +57,9 @@ GEM
53
57
  json (>= 1.8, < 3)
54
58
  simplecov-html (~> 0.10.0)
55
59
  simplecov-html (0.10.2)
56
- transproc (1.0.2)
60
+ transproc (1.0.3)
57
61
  unicode-display_width (1.4.0)
62
+ uri_template (0.7.0)
58
63
 
59
64
  PLATFORMS
60
65
  ruby
data/README.md CHANGED
@@ -2,7 +2,11 @@
2
2
 
3
3
  Docker Declarative Specific Language
4
4
 
5
- `ddsl` lets you declare how your docker images are built and what checks (test, linter, etc) need be run in your images.
5
+ `ddsl` allow developers to express in a declarative way how application are built, run and tested. Building, running and testing applications should be semlessly, independently on what environment your are. `ddsl` makes the latter easy by providing one cli to use in CI and development environments.
6
+
7
+ ## Usage
8
+
9
+ `ddsl` it's a command line tool that works with a companion `.ddsl.yml` file. In the `.ddsl.yml` file you can declare the diferent builds and runs that your application will need. A very simple example would look like this:
6
10
 
7
11
  ```yaml
8
12
  version: 1
@@ -55,13 +59,31 @@ runs:
55
59
  cmd: rubocop .
56
60
  ```
57
61
 
62
+ In order to run the `feature-branch` build for example, you would need to invoke the `ddsl` like this:
63
+
64
+ `ddsl build feature-branch`
65
+
66
+ Or maybe you want to run you tests
67
+
68
+ `ddsl run test`
69
+
70
+ Or maybe you want to run your tests and also lint your code
71
+
72
+ `ddsl run test lint`
73
+
74
+ ## Documentation
75
+
76
+ The best documentation at this moment is looking at the source code of the project. `ddsl` uses itself to run in CI and developers use it to run in their development environments. Take a look at `.ddsl.yml` file in the root of the repository for more information.
77
+
78
+ Full documentation of the schema can be found here https://github.com/bilby91/ddsl/blob/master/docs/ddsl.schema.md
79
+
58
80
  ## Contnious Integration
59
81
 
60
82
  | Provider | Status |
61
83
  |-----------|------------------------------------------------------------------------------------------------------------------------------------------|
62
84
  | GitLab CI | [![Gitlab CI](https://img.shields.io/gitlab/pipeline/bilby91/ddsl/master.svg)](https://gitlab.com/bilby91/ddsl) |
63
85
  | Circle CI | [![Circle CI](https://img.shields.io/circleci/project/github/bilby91/ddsl/master.svg)](https://circleci.com/gh/bilby91/ddsl/tree/master) |
64
- | Travis CI | [![Travis CI](https://img.shields.io/travis/bilby91/ddsl/master.svg)](https://travis-ci.com/bilby91/ddsl) |
86
+ | Travis CI | [![Travis CI](https://img.shields.io/travis/com/bilby91/ddsl/master.svg)](https://travis-ci.com/bilby91/ddsl) |
65
87
 
66
88
  ## Dependencies
67
89
 
@@ -69,17 +91,7 @@ runs:
69
91
  - docker
70
92
  - docker-compose
71
93
 
72
- ## TODO
73
-
74
- - [X] Docker Compose support
75
- - [X] Variable interpolation
76
- - [X] Add CircleCI
77
- - [X] Add GitLabCI
78
- - [X] Add TravisCI
79
- - [X] Registries?
80
- - [ ] Variable sharing/reusing
81
- - [ ] External secret proviers ? (KMS, Google?)
82
-
83
94
  ## Contact
84
95
 
85
- - Martín Fernández <fmartin91@gmail.com>
96
+ - Martín Fernández <fmartin91@gmail.com>
97
+ - Iván Etchart <ivan.etchart@me.com>
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.add_dependency 'clamp', '~> 1'
21
21
  spec.add_dependency 'json', '~> 2'
22
- spec.add_dependency 'json-schema', '~> 2'
22
+ spec.add_dependency 'json_schemer', '~> 0.1'
23
23
  spec.add_dependency 'transproc', '~> 1'
24
24
  spec.add_development_dependency 'rspec', '~> 3'
25
25
  spec.add_development_dependency 'rubocop', '~> 0.60'
@@ -43,4 +43,4 @@ RUN gem build ddsl.gemspec
43
43
 
44
44
  # Install binary
45
45
  # FIXME: We need to load the version dynamically
46
- RUN gem install --no-rdoc --no-ri --local ddsl-0.0.3.gem
46
+ RUN gem install --no-rdoc --no-ri --local ddsl-0.0.4.gem
@@ -0,0 +1,141 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-06/schema#",
3
+ "$id": "https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json",
4
+ "title": "Build",
5
+ "description": "Build task to perform using either docker or docker-compose",
6
+ "type": "object",
7
+ "required": [
8
+ "name"
9
+ ],
10
+ "oneOf": [
11
+ {
12
+ "$ref": "#/definitions/build_docker_options"
13
+ },
14
+ {
15
+ "$ref": "#/definitions/build_docker_compose_options"
16
+ }
17
+ ],
18
+ "properties": {
19
+ "name": {
20
+ "type": "string",
21
+ "description": "Unique name to identify the build task."
22
+ }
23
+ },
24
+ "definitions": {
25
+ "build_docker_options": {
26
+ "type": "object",
27
+ "required": [
28
+ "type",
29
+ "context",
30
+ "file"
31
+ ],
32
+ "properties": {
33
+ "type": {
34
+ "type": "string",
35
+ "enum": [
36
+ "docker"
37
+ ],
38
+ "description": "Type of builder to use"
39
+ },
40
+ "context": {
41
+ "type": "string",
42
+ "description": "Path for the `docker build` context"
43
+ },
44
+ "file": {
45
+ "type": "string",
46
+ "description": "Path to the Dockerfile to build"
47
+ },
48
+ "build_args": {
49
+ "type": "object",
50
+ "additionalProperties": {
51
+ "type": "string"
52
+ },
53
+ "description": "Set build-time variables"
54
+ },
55
+ "tags": {
56
+ "type": "array",
57
+ "items": {
58
+ "type": "string"
59
+ },
60
+ "description": "Name and optionally a tag in the ‘name:tag’ format"
61
+ },
62
+ "labels": {
63
+ "type": "array",
64
+ "items": {
65
+ "type": "string"
66
+ },
67
+ "description": "Set metadata for an image"
68
+ },
69
+ "cache_from": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "string"
73
+ },
74
+ "description": "Images to consider as cache sources"
75
+ },
76
+ "push": {
77
+ "type": "boolean",
78
+ "description": "If true, push any configured tag to the appropiate registry"
79
+ },
80
+ "pull": {
81
+ "type": "boolean",
82
+ "description": "If true, all images specified in `cache_from` will be pulled before building"
83
+ }
84
+ }
85
+ },
86
+ "build_docker_compose_options": {
87
+ "type": "object",
88
+ "required": [
89
+ "type"
90
+ ],
91
+ "properties": {
92
+ "type": {
93
+ "type": "string",
94
+ "enum": [
95
+ "docker-compose"
96
+ ],
97
+ "description": "Type of builder to use"
98
+ },
99
+ "file": {
100
+ "type": "string",
101
+ "description": "Path to the docker-compose file"
102
+ },
103
+ "service": {
104
+ "type": "string",
105
+ "description": "Name of the docker-compose service to build"
106
+ },
107
+ "no_cache": {
108
+ "type": "boolean",
109
+ "description": "Do not use cache when building the image"
110
+ },
111
+ "pull": {
112
+ "type": "boolean",
113
+ "description": "Always attempt to pull a newer version of the image"
114
+ },
115
+ "force_rm": {
116
+ "type": "boolean",
117
+ "description": "Always remove intermediate containers"
118
+ },
119
+ "compress": {
120
+ "type": "boolean",
121
+ "description": "Compress the build context using gzip"
122
+ },
123
+ "parallel": {
124
+ "type": "boolean",
125
+ "description": "Build images in parallel"
126
+ },
127
+ "memory": {
128
+ "type": "string",
129
+ "description": "Sets memory limit for the build container."
130
+ },
131
+ "build_args": {
132
+ "type": "object",
133
+ "additionalProperties": {
134
+ "type": "string"
135
+ },
136
+ "description": "Set build-time variables for services"
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,383 @@
1
+
2
+ # Build Schema
3
+
4
+ ```
5
+ https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json
6
+ ```
7
+
8
+ Build task to perform using either docker or docker-compose
9
+
10
+ | Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In |
11
+ |----------|------------|--------|--------------|-------------------|-----------------------|------------|
12
+ | Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [build.schema.json](build.schema.json) |
13
+
14
+ # Build Properties
15
+
16
+ | Property | Type | Required | Defined by |
17
+ |----------|------|----------|------------|
18
+ | [name](#name) | `string` | **Required** | Build (this schema) |
19
+ | `*` | any | Additional | this schema *allows* additional properties |
20
+
21
+ ## name
22
+
23
+ Unique name to identify the build task.
24
+
25
+ `name`
26
+
27
+ * is **required**
28
+ * type: `string`
29
+ * defined in this schema
30
+
31
+ ### name Type
32
+
33
+
34
+ `string`
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+ # Build Definitions
43
+
44
+ | Property | Type | Group |
45
+ |----------|------|-------|
46
+ | [build_args](#build_args) | `object` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
47
+ | [cache_from](#cache_from) | `string[]` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_options` |
48
+ | [compress](#compress) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
49
+ | [context](#context) | `string` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_options` |
50
+ | [file](#file) | `string` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
51
+ | [force_rm](#force_rm) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
52
+ | [labels](#labels) | `string[]` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_options` |
53
+ | [memory](#memory) | `string` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
54
+ | [no_cache](#no_cache) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
55
+ | [parallel](#parallel) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
56
+ | [pull](#pull) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
57
+ | [push](#push) | `boolean` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_options` |
58
+ | [service](#service) | `string` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
59
+ | [tags](#tags) | `string[]` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_options` |
60
+ | [type](#type) | `enum` | `https://raw.githubusercontent.com/bilby91/ddsl/master/docs/build.schema.json#/definitions/build_docker_compose_options` |
61
+
62
+ ## build_args
63
+
64
+ Set build-time variables for services
65
+
66
+ `build_args`
67
+
68
+ * is optional
69
+ * type: `object`
70
+ * defined in this schema
71
+
72
+ ### build_args Type
73
+
74
+
75
+ `object` with following properties:
76
+
77
+
78
+ | Property | Type | Required |
79
+ |----------|------|----------|
80
+
81
+
82
+
83
+
84
+
85
+
86
+ ## cache_from
87
+
88
+ Images to consider as cache sources
89
+
90
+ `cache_from`
91
+
92
+ * is optional
93
+ * type: `string[]`
94
+ * defined in this schema
95
+
96
+ ### cache_from Type
97
+
98
+
99
+ Array type: `string[]`
100
+
101
+ All items must be of the type:
102
+ `string`
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+ ## compress
114
+
115
+ Compress the build context using gzip
116
+
117
+ `compress`
118
+
119
+ * is optional
120
+ * type: `boolean`
121
+ * defined in this schema
122
+
123
+ ### compress Type
124
+
125
+
126
+ `boolean`
127
+
128
+
129
+
130
+
131
+
132
+ ## context
133
+
134
+ Path for the `docker build` context
135
+
136
+ `context`
137
+
138
+ * is optional
139
+ * type: `string`
140
+ * defined in this schema
141
+
142
+ ### context Type
143
+
144
+
145
+ `string`
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+ ## file
154
+
155
+ Path to the docker-compose file
156
+
157
+ `file`
158
+
159
+ * is optional
160
+ * type: `string`
161
+ * defined in this schema
162
+
163
+ ### file Type
164
+
165
+
166
+ `string`
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+ ## force_rm
175
+
176
+ Always remove intermediate containers
177
+
178
+ `force_rm`
179
+
180
+ * is optional
181
+ * type: `boolean`
182
+ * defined in this schema
183
+
184
+ ### force_rm Type
185
+
186
+
187
+ `boolean`
188
+
189
+
190
+
191
+
192
+
193
+ ## labels
194
+
195
+ Set metadata for an image
196
+
197
+ `labels`
198
+
199
+ * is optional
200
+ * type: `string[]`
201
+ * defined in this schema
202
+
203
+ ### labels Type
204
+
205
+
206
+ Array type: `string[]`
207
+
208
+ All items must be of the type:
209
+ `string`
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+ ## memory
221
+
222
+ Sets memory limit for the build container.
223
+
224
+ `memory`
225
+
226
+ * is optional
227
+ * type: `string`
228
+ * defined in this schema
229
+
230
+ ### memory Type
231
+
232
+
233
+ `string`
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+ ## no_cache
242
+
243
+ Do not use cache when building the image
244
+
245
+ `no_cache`
246
+
247
+ * is optional
248
+ * type: `boolean`
249
+ * defined in this schema
250
+
251
+ ### no_cache Type
252
+
253
+
254
+ `boolean`
255
+
256
+
257
+
258
+
259
+
260
+ ## parallel
261
+
262
+ Build images in parallel
263
+
264
+ `parallel`
265
+
266
+ * is optional
267
+ * type: `boolean`
268
+ * defined in this schema
269
+
270
+ ### parallel Type
271
+
272
+
273
+ `boolean`
274
+
275
+
276
+
277
+
278
+
279
+ ## pull
280
+
281
+ Always attempt to pull a newer version of the image
282
+
283
+ `pull`
284
+
285
+ * is optional
286
+ * type: `boolean`
287
+ * defined in this schema
288
+
289
+ ### pull Type
290
+
291
+
292
+ `boolean`
293
+
294
+
295
+
296
+
297
+
298
+ ## push
299
+
300
+ If true, push any configured tag to the appropiate registry
301
+
302
+ `push`
303
+
304
+ * is optional
305
+ * type: `boolean`
306
+ * defined in this schema
307
+
308
+ ### push Type
309
+
310
+
311
+ `boolean`
312
+
313
+
314
+
315
+
316
+
317
+ ## service
318
+
319
+ Name of the docker-compose service to build
320
+
321
+ `service`
322
+
323
+ * is optional
324
+ * type: `string`
325
+ * defined in this schema
326
+
327
+ ### service Type
328
+
329
+
330
+ `string`
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ ## tags
339
+
340
+ Name and optionally a tag in the ‘name:tag’ format
341
+
342
+ `tags`
343
+
344
+ * is optional
345
+ * type: `string[]`
346
+ * defined in this schema
347
+
348
+ ### tags Type
349
+
350
+
351
+ Array type: `string[]`
352
+
353
+ All items must be of the type:
354
+ `string`
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+ ## type
366
+
367
+ Type of builder to use
368
+
369
+ `type`
370
+
371
+ * is optional
372
+ * type: `enum`
373
+ * defined in this schema
374
+
375
+ The value of this property **must** be equal to one of the [known values below](#type-known-values).
376
+
377
+ ### type Known Values
378
+ | Value | Description |
379
+ |-------|-------------|
380
+ | `docker-compose` | |
381
+
382
+
383
+