Skip to content

Latest commit

 

History

History
829 lines (745 loc) · 28.7 KB

config.md

File metadata and controls

829 lines (745 loc) · 28.7 KB
 
Sep 25, 2015
Sep 25, 2015
1
# Container Configuration file
Jun 25, 2015
Jun 25, 2015
2
Aug 26, 2015
Aug 26, 2015
3
The container's top-level directory MUST contain a configuration file called `config.json`.
Jul 19, 2016
Jul 19, 2016
4
The canonical schema is defined in this document, but there is a JSON Schema in [`schema/config-schema.json`](schema/config-schema.json) and Go bindings in [`specs-go/config.go`](specs-go/config.go).
Feb 8, 2017
Feb 8, 2017
5
6
[Platform](spec.md#platforms)-specific configuration schema are defined in the [platform-specific documents](#platform-specific-configuration) linked below.
For properties that are only defined for some [platforms](spec.md#platforms), the Go property has a `platform` tag listing those protocols (e.g. `platform:"linux,solaris"`).
Jun 25, 2015
Jun 25, 2015
7
Jun 30, 2015
Jun 30, 2015
8
9
The configuration file contains metadata necessary to implement standard operations against the container.
This includes the process to run, environment variables to inject, sandboxing features to use, etc.
Jun 25, 2015
Jun 25, 2015
10
Feb 7, 2017
Feb 7, 2017
11
12
13
14
Below is a detailed description of each field defined in the configuration format and valid values are specified.
Platform-specific fields are identified as such.
For all platform-specific configuration values, the scope defined below in the [Platform-specific configuration](#platform-specific-configuration) section applies.
Jun 25, 2015
Jun 25, 2015
15
Jan 15, 2016
Jan 15, 2016
16
## Specification version
Jun 25, 2015
Jun 25, 2015
17
Sep 18, 2016
Sep 18, 2016
18
* **`ociVersion`** (string, REQUIRED) MUST be in [SemVer v2.0.0](http://semver.org/spec/v2.0.0.html) format and specifies the version of the Open Container Runtime Specification with which the bundle complies.
Aug 3, 2016
Aug 3, 2016
19
The Open Container Runtime Specification follows semantic versioning and retains forward and backward compatibility within major versions.
Sep 14, 2016
Sep 14, 2016
20
For example, if a configuration is compliant with version 1.1 of this specification, it is compatible with all runtimes that support any 1.1 or later release of this specification, but is not compatible with a runtime that supports 1.0 and not 1.1.
Jun 25, 2015
Jun 25, 2015
21
Apr 8, 2016
Apr 8, 2016
22
### Example
Jun 30, 2015
Jun 30, 2015
23
Jun 29, 2015
Jun 29, 2015
24
```json
Jan 15, 2016
Jan 15, 2016
25
"ociVersion": "0.1.0"
Jun 25, 2015
Jun 25, 2015
26
27
```
Jun 30, 2015
Jun 30, 2015
28
## Root Configuration
Jun 25, 2015
Jun 25, 2015
29
Feb 7, 2017
Feb 7, 2017
30
**`root`** (object, REQUIRED) specifies the container's root filesystem.
Jul 1, 2015
Jul 1, 2015
31
Sep 18, 2016
Sep 18, 2016
32
* **`path`** (string, REQUIRED) Specifies the path to the root filesystem for the container.
Feb 7, 2017
Feb 7, 2017
33
34
The path is either an absolute path or a relative path to the bundle.
On Linux, for example, with a bundle at `/to/bundle` and a root filesystem at `/to/bundle/rootfs`, the `path` value can be either `/to/bundle/rootfs` or `rootfs`.
Jul 22, 2016
Jul 22, 2016
35
A directory MUST exist at the path declared by the field.
Sep 18, 2016
Sep 18, 2016
36
* **`readonly`** (bool, OPTIONAL) If true then the root filesystem MUST be read-only inside the container, defaults to false.
Jun 25, 2015
Jun 25, 2015
37
Apr 8, 2016
Apr 8, 2016
38
### Example
Jun 30, 2015
Jun 30, 2015
39
Jun 29, 2015
Jun 29, 2015
40
```json
Jun 30, 2015
Jun 30, 2015
41
42
43
44
"root": {
"path": "rootfs",
"readonly": true
}
Jun 25, 2015
Jun 25, 2015
45
46
```
Jan 27, 2016
Jan 27, 2016
47
## Mounts
Sep 3, 2015
Sep 3, 2015
48
Feb 7, 2017
Feb 7, 2017
49
**`mounts`** (array, OPTIONAL) specifies additional mounts beyond [`root`](#root-configuration).
Sep 11, 2015
Sep 11, 2015
50
The runtime MUST mount entries in the listed order.
Feb 7, 2017
Feb 7, 2017
51
52
53
54
For Linux, the parameters are as documented in [the mount system call](http://man7.org/linux/man-pages/man2/mount.2.html).
For Solaris, the mount entry corresponds to the 'fs' resource in zonecfg(8).
For Windows, see links for details about [mountvol](http://ss64.com/nt/mountvol.html) and [SetVolumeMountPoint](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365561(v=vs.85).aspx).
Sep 3, 2015
Sep 3, 2015
55
Sep 18, 2016
Sep 18, 2016
56
* **`destination`** (string, REQUIRED) Destination of mount point: path inside container.
Nov 4, 2016
Nov 4, 2016
57
This value MUST be an absolute path.
Feb 7, 2017
Feb 7, 2017
58
59
* Windows: one mount destination MUST NOT be nested within another mount (e.g., c:\\foo and c:\\foo\\bar).
* Solaris: corresponds to "dir" of the fs resource in zonecfg(8).
Sep 18, 2016
Sep 18, 2016
60
* **`type`** (string, REQUIRED) The filesystem type of the filesystem to be mounted.
Feb 7, 2017
Feb 7, 2017
61
62
63
* Linux: valid *filesystemtype* supported by the kernel as listed in */proc/filesystems* (e.g., "minix", "ext2", "ext3", "jfs", "xfs", "reiserfs", "msdos", "proc", "nfs", "iso9660").
* Windows: the type of file system on the volume, e.g. "ntfs".
* Solaris: corresponds to "type" of the fs resource in zonecfg(8).
Sep 18, 2016
Sep 18, 2016
64
* **`source`** (string, REQUIRED) A device name, but can also be a directory name or a dummy.
Feb 7, 2017
Feb 7, 2017
65
66
* Windows: the volume name that is the target of the mount point, \\?\Volume\{GUID}\ (on Windows source is called target).
* Solaris: corresponds to "special" of the fs resource in zonecfg(8).
Sep 18, 2016
Sep 18, 2016
67
* **`options`** (list of strings, OPTIONAL) Mount options of the filesystem to be used.
Feb 7, 2017
Feb 7, 2017
68
69
* Linux: [supported][mount.8-filesystem-independent] [options][mount.8-filesystem-specific] are listed in [mount(8)][mount.8].
* Solaris: corresponds to "options" of the fs resource in zonecfg(8).
Sep 3, 2015
Sep 3, 2015
70
Apr 8, 2016
Apr 8, 2016
71
### Example (Linux)
Sep 3, 2015
Sep 3, 2015
72
73
74
75
```json
"mounts": [
{
Jan 27, 2016
Jan 27, 2016
76
77
78
79
"destination": "/tmp",
"type": "tmpfs",
"source": "tmpfs",
"options": ["nosuid","strictatime","mode=755","size=65536k"]
Sep 3, 2015
Sep 3, 2015
80
81
},
{
Jan 27, 2016
Jan 27, 2016
82
83
84
85
"destination": "/data",
"type": "bind",
"source": "/volumes/testing",
"options": ["rbind","rw"]
Sep 3, 2015
Sep 3, 2015
86
87
88
89
}
]
```
Apr 8, 2016
Apr 8, 2016
90
### Example (Windows)
Jan 27, 2016
Jan 27, 2016
91
92
93
94
95
96
97
98
99
100
101
102
```json
"mounts": [
"myfancymountpoint": {
"destination": "C:\\Users\\crosbymichael\\My Fancy Mount Point\\",
"type": "ntfs",
"source": "\\\\?\\Volume\\{2eca078d-5cbc-43d3-aff8-7e8511f60d0e}\\",
"options": []
}
]
```
Oct 12, 2016
Oct 12, 2016
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
### Example (Solaris)
```json
"mounts": [
{
"destination": "/opt/local",
"type": "lofs",
"source": "/usr/local",
"options": ["ro","nodevices"]
},
{
"destination": "/opt/sfw",
"type": "lofs",
"source": "/opt/sfw"
}
]
```
Nov 11, 2016
Nov 11, 2016
121
## Process
Jun 25, 2015
Jun 25, 2015
122
Feb 7, 2017
Feb 7, 2017
123
**`process`** (object, REQUIRED) specifies the container process.
Aug 3, 2016
Aug 3, 2016
124
Nov 10, 2016
Nov 10, 2016
125
* **`terminal`** (bool, OPTIONAL) specifies whether a terminal is attached to that process, defaults to false.
Feb 7, 2017
Feb 7, 2017
126
As an example, if set to true on Linux a pseudoterminal pair is allocated for the container process and the pseudoterminal slave is duplicated on the container process's [standard streams][stdin.3].
Sep 20, 2016
Sep 20, 2016
127
128
129
* **`consoleSize`** (object, OPTIONAL) specifies the console size of the terminal if attached, containing the following properties:
* **`height`** (uint, REQUIRED)
* **`width`** (uint, REQUIRED)
Sep 18, 2016
Sep 18, 2016
130
* **`cwd`** (string, REQUIRED) is the working directory that will be set for the executable.
Jul 22, 2016
Jul 22, 2016
131
This value MUST be an absolute path.
Jan 4, 2017
Jan 4, 2017
132
* **`env`** (array of strings, OPTIONAL) with the same semantics as [IEEE Std 1003.1-2001's `environ`][ieee-1003.1-2001-xbd-c8.1].
Jan 4, 2017
Jan 4, 2017
133
134
* **`args`** (array of strings, REQUIRED) with similar semantics to [IEEE Std 1003.1-2001 `execvp`'s *argv*][ieee-1003.1-2001-xsh-exec].
This specification extends the IEEE standard in that at least one entry is REQUIRED, and that entry is used with the same semantics as `execvp`'s *file*.
Feb 22, 2017
Feb 22, 2017
135
136
137
138
139
140
141
* **`capabilities`** (object, OPTIONAL) is an object containing arrays that specifies the sets of capabilities for the process(es) inside the container. Valid values are platform-specific. For example, valid values for Linux are defined in the [CAPABILITIES(7)](http://man7.org/linux/man-pages/man7/capabilities.7.html) man page.
capabilities contains the following properties:
* **`effective`** (array of strings, OPTIONAL) - the `effective` field is an array of effective capabilities that are kept for the process.
* **`bounding`** (array of strings, OPTIONAL) - the `bounding` field is an array of bounding capabilities that are kept for the process.
* **`inheritable`** (array of strings, OPTIONAL) - the `inheritable` field is an array of inheritable capabilities that are kept for the process.
* **`permitted`** (array of strings, OPTIONAL) - the `permitted` field is an array of permitted capabilities that are kept for the process.
* **`ambient`** (array of strings, OPTIONAL) - the `ambient` field is an array of ambient capabilities that are kept for the process.
Nov 3, 2016
Nov 3, 2016
142
143
144
* **`rlimits`** (array of objects, OPTIONAL) allows setting resource limits for a process inside the container.
Each entry has the following structure:
Feb 7, 2017
Feb 7, 2017
145
146
147
* **`type`** (string, REQUIRED) - the platform resource being limited, for example on Linux as defined in the [SETRLIMIT(2)](http://man7.org/linux/man-pages/man2/setrlimit.2.html) man page.
* **`soft`** (uint64, REQUIRED) - the value of the limit enforced for the corresponding resource.
* **`hard`** (uint64, REQUIRED) - the ceiling for the soft limit that could be set by an unprivileged process. Only a privileged process (e.g. under Linux: one with the CAP_SYS_RESOURCE capability) can raise a hard limit.
Nov 3, 2016
Nov 3, 2016
148
149
150
If `rlimits` contains duplicated entries with same `type`, the runtime MUST error out.
Sep 18, 2016
Sep 18, 2016
151
* **`noNewPrivileges`** (bool, OPTIONAL) setting `noNewPrivileges` to true prevents the processes in the container from gaining additional privileges.
Feb 7, 2017
Feb 7, 2017
152
153
154
155
156
157
158
159
As an example, the ['no_new_privs' kernel doc](https://www.kernel.org/doc/Documentation/prctl/no_new_privs.txt) has more information on how this is achieved using a prctl system call on Linux.
For Linux-based systems the process structure supports the following process specific fields.
* **`apparmorProfile`** (string, OPTIONAL) specifies the name of the AppArmor profile to be applied to processes in the container.
For more information about AppArmor, see [AppArmor documentation](https://wiki.ubuntu.com/AppArmor)
* **`selinuxLabel`** (string, OPTIONAL) specifies the SELinux label to be applied to the processes in the container.
For more information about SELinux, see [SELinux documentation](http://selinuxproject.org/page/Main_Page)
Mar 2, 2016
Mar 2, 2016
160
Mar 17, 2016
Mar 17, 2016
161
162
### User
Jul 1, 2015
Jul 1, 2015
163
The user for the process is a platform-specific structure that allows specific control over which user the process runs as.
Mar 17, 2016
Mar 17, 2016
164
May 4, 2016
May 4, 2016
165
#### Linux and Solaris User
Mar 17, 2016
Mar 17, 2016
166
May 4, 2016
May 4, 2016
167
For Linux and Solaris based systems the user structure has the following fields:
Jun 30, 2015
Jun 30, 2015
168
Sep 18, 2016
Sep 18, 2016
169
170
* **`uid`** (int, REQUIRED) specifies the user ID in the [container namespace][container-namespace].
* **`gid`** (int, REQUIRED) specifies the group ID in the [container namespace][container-namespace].
Sep 18, 2016
Sep 18, 2016
171
* **`additionalGids`** (array of ints, OPTIONAL) specifies additional group IDs (in the [container namespace][container-namespace]) to be added to the process.
Jun 30, 2015
Jun 30, 2015
172
Mar 17, 2016
Mar 17, 2016
173
174
_Note: symbolic name for uid and gid, such as uname and gname respectively, are left to upper levels to derive (i.e. `/etc/passwd` parsing, NSS, etc)_
Apr 8, 2016
Apr 8, 2016
175
### Example (Linux)
Jun 30, 2015
Jun 30, 2015
176
Jun 29, 2015
Jun 29, 2015
177
```json
Jun 30, 2015
Jun 30, 2015
178
179
"process": {
"terminal": true,
Sep 20, 2016
Sep 20, 2016
180
181
182
183
"consoleSize": {
"height": 25,
"width": 80
},
Jun 30, 2015
Jun 30, 2015
184
185
186
"user": {
"uid": 1,
"gid": 1,
Aug 29, 2015
Aug 29, 2015
187
"additionalGids": [5, 6]
Jun 30, 2015
Jun 30, 2015
188
},
Jun 30, 2015
Jun 30, 2015
189
190
191
192
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
Aug 29, 2015
Aug 29, 2015
193
"cwd": "/root",
Jun 30, 2015
Jun 30, 2015
194
195
"args": [
"sh"
Mar 2, 2016
Mar 2, 2016
196
],
Mar 2, 2016
Mar 2, 2016
197
198
"apparmorProfile": "acme_secure_profile",
"selinuxLabel": "system_u:system_r:svirt_lxc_net_t:s0:c124,c675",
Mar 2, 2016
Mar 2, 2016
199
"noNewPrivileges": true,
Feb 22, 2017
Feb 22, 2017
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
"capabilities": {
"bounding": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"permitted": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"inheritable": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"effective": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
],
"ambient": [
"CAP_NET_BIND_SERVICE"
]
},
Mar 10, 2016
Mar 10, 2016
224
225
226
227
228
229
"rlimits": [
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
}
Jun 30, 2015
Jun 30, 2015
230
231
]
}
Jun 25, 2015
Jun 25, 2015
232
```
May 4, 2016
May 4, 2016
233
234
235
236
237
### Example (Solaris)
```json
"process": {
"terminal": true,
Sep 20, 2016
Sep 20, 2016
238
239
240
241
"consoleSize": {
"height": 25,
"width": 80
},
May 4, 2016
May 4, 2016
242
243
244
245
246
247
248
249
250
251
252
253
"user": {
"uid": 1,
"gid": 1,
"additionalGids": [2, 8]
},
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/root",
"args": [
"/usr/bin/bash"
Sep 14, 2016
Sep 14, 2016
254
255
256
257
258
259
260
261
]
}
```
#### Windows User
For Windows based systems the user structure has the following fields:
Sep 18, 2016
Sep 18, 2016
262
* **`username`** (string, OPTIONAL) specifies the user name for the process.
Sep 14, 2016
Sep 14, 2016
263
264
265
266
267
268
269
270
271
272
273
### Example (Windows)
```json
"process": {
"terminal": true,
"user": {
"username": "containeradministrator"
},
"env": [
"VARIABLE=1"
May 4, 2016
May 4, 2016
274
],
Sep 14, 2016
Sep 14, 2016
275
276
277
278
"cwd": "c:\\foo",
"args": [
"someapp.exe",
]
May 4, 2016
May 4, 2016
279
280
}
```
Jun 25, 2015
Jun 25, 2015
281
282
Jun 30, 2015
Jun 30, 2015
283
## Hostname
Jun 25, 2015
Jun 25, 2015
284
Feb 7, 2017
Feb 7, 2017
285
286
* **`hostname`** (string, OPTIONAL) specifies the container's hostname as seen by processes running inside the container.
On Linux, for example, this will change the hostname in the [container][container-namespace] [UTS namespace][uts-namespace].
Jan 11, 2017
Jan 11, 2017
287
Depending on your [namespace configuration](config-linux.md#namespaces), the container UTS namespace may be the [runtime UTS namespace][runtime-namespace].
Jun 25, 2015
Jun 25, 2015
288
Apr 8, 2016
Apr 8, 2016
289
### Example
Jun 30, 2015
Jun 30, 2015
290
Jun 29, 2015
Jun 29, 2015
291
```json
Jun 30, 2015
Jun 30, 2015
292
"hostname": "mrsdalloway"
Jun 25, 2015
Jun 25, 2015
293
294
```
May 2, 2016
May 2, 2016
295
## Platform
Jun 25, 2015
Jun 25, 2015
296
Aug 3, 2016
Aug 3, 2016
297
298
**`platform`** specifies the configuration's target platform.
Feb 7, 2017
Feb 7, 2017
299
300
* **`os`** (string, REQUIRED) specifies the operating system family of the container configuration's specified [`root`](#root-configuration) file system bundle.
The runtime MUST generate an error if it does not support the specified **`os`**.
May 20, 2016
May 20, 2016
301
302
Bundles SHOULD use, and runtimes SHOULD understand, **`os`** entries listed in the Go Language document for [`$GOOS`][go-environment].
If an operating system is not included in the `$GOOS` documentation, it SHOULD be submitted to this specification for standardization.
Feb 7, 2017
Feb 7, 2017
303
304
* **`arch`** (string, REQUIRED) specifies the instruction set for which the binaries in the specified [`root`](#root-configuration) file system bundle have been compiled.
The runtime MUST generate an error if it does not support the specified **`arch`**.
May 20, 2016
May 20, 2016
305
306
Values for **`arch`** SHOULD use, and runtimes SHOULD understand, **`arch`** entries listed in the Go Language document for [`$GOARCH`][go-environment].
If an architecture is not included in the `$GOARCH` documentation, it SHOULD be submitted to this specification for standardization.
Jun 30, 2015
Jun 30, 2015
307
Apr 8, 2016
Apr 8, 2016
308
309
### Example
Jun 29, 2015
Jun 29, 2015
310
```json
Jun 30, 2015
Jun 30, 2015
311
312
313
314
"platform": {
"os": "linux",
"arch": "amd64"
}
Jun 25, 2015
Jun 25, 2015
315
316
```
May 2, 2016
May 2, 2016
317
318
## Platform-specific configuration
Feb 7, 2017
Feb 7, 2017
319
320
321
[**`platform.os`**](#platform) is used to specify platform-specific configuration.
Runtime implementations MAY support any valid values for platform-specific fields as part of this configuration.
Implementations MUST error out when invalid values are encountered and MUST generate an error message and error out when encountering valid values it chooses to not support.
May 2, 2016
May 2, 2016
322
Sep 18, 2016
Sep 18, 2016
323
* **`linux`** (object, OPTIONAL) [Linux-specific configuration](config-linux.md).
Feb 7, 2017
Feb 7, 2017
324
This MAY be set if **`platform.os`** is `linux` and MUST NOT be set otherwise.
Nov 14, 2016
Nov 14, 2016
325
* **`windows`** (object, OPTIONAL) [Windows-specific configuration](config-windows.md).
Feb 7, 2017
Feb 7, 2017
326
327
328
This MAY be set if **`platform.os`** is `windows` and MUST NOT be set otherwise.
* **`solaris`** (object, OPTIONAL) [Solaris-specific configuration](config-solaris.md).
This MAY be set if **`platform.os`** is `solaris` and MUST NOT be set otherwise.
May 2, 2016
May 2, 2016
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
### Example (Linux)
```json
{
"platform": {
"os": "linux",
"arch": "amd64"
},
"linux": {
"namespaces": [
{
"type": "pid"
}
]
}
}
```
Oct 6, 2015
Oct 6, 2015
347
Jan 27, 2016
Jan 27, 2016
348
349
## Hooks
Feb 7, 2017
Feb 7, 2017
350
Hooks allow for the configuration of custom actions related to the [lifecycle](runtime.md#lifecycle) of the container.
Jan 27, 2016
Jan 27, 2016
351
Jan 4, 2017
Jan 4, 2017
352
353
354
355
356
* **`hooks`** (object, OPTIONAL) MAY contain any of the following properties:
* **`prestart`** (array, OPTIONAL) is an array of [pre-start hooks](#prestart).
Entries in the array contain the following properties:
* **`path`** (string, REQUIRED) with similar semantics to [IEEE Std 1003.1-2001 `execv`'s *path*][ieee-1003.1-2001-xsh-exec].
This specification extends the IEEE standard in that **`path`** MUST be absolute.
Feb 9, 2017
Feb 9, 2017
357
* **`args`** (array of strings, OPTIONAL) with the same semantics as [IEEE Std 1003.1-2001 `execv`'s *argv*][ieee-1003.1-2001-xsh-exec].
Jan 4, 2017
Jan 4, 2017
358
359
360
361
362
363
* **`env`** (array of strings, OPTIONAL) with the same semantics as [IEEE Std 1003.1-2001's `environ`][ieee-1003.1-2001-xbd-c8.1].
* **`timeout`** (int, OPTIONAL) is the number of seconds before aborting the hook.
* **`poststart`** (array, OPTIONAL) is an array of [post-start hooks](#poststart).
Entries in the array have the same schema as pre-start entries.
* **`poststop`** (array, OPTIONAL) is an array of [post-stop hooks](#poststop).
Entries in the array have the same schema as pre-start entries.
Jan 27, 2016
Jan 27, 2016
364
Feb 7, 2017
Feb 7, 2017
365
Hooks allow users to specify programs to run before or after various lifecycle events.
Jan 27, 2016
Jan 27, 2016
366
Hooks MUST be called in the listed order.
Feb 7, 2017
Feb 7, 2017
367
The [state](runtime.md#state) of the container MUST be passed to hooks over stdin so that they may do work appropriate to the current state of the container.
Jan 27, 2016
Jan 27, 2016
368
369
370
### Prestart
Feb 7, 2017
Feb 7, 2017
371
372
The pre-start hooks MUST be called after the container has been created, but before the user supplied command is executed.
On Linux, for example, they are called after the container namespaces are created, so they provide an opportunity to customize the container (e.g. the network namespace could be specified in this hook).
Jan 27, 2016
Jan 27, 2016
373
Feb 7, 2017
Feb 7, 2017
374
If a hook returns a non-zero exit code, an error including the exit code and the stderr MUST be returned to the caller and the container MUST be destroyed.
Jan 27, 2016
Jan 27, 2016
375
376
377
### Poststart
Feb 7, 2017
Feb 7, 2017
378
379
The post-start hooks MUST be called after the user process is started.
For example, this hook can notify the user that the container process is spawned.
Jan 27, 2016
Jan 27, 2016
380
Feb 7, 2017
Feb 7, 2017
381
If a hook returns a non-zero exit code, then an error MUST be logged and the remaining hooks are executed.
Jan 27, 2016
Jan 27, 2016
382
383
384
### Poststop
Feb 7, 2017
Feb 7, 2017
385
386
387
The post-stop hooks MUST be called after the container process is stopped.
Cleanup or debugging functions are examples of such a hook.
If a hook returns a non-zero exit code, then an error MUST be logged and the remaining hooks are executed.
Jan 27, 2016
Jan 27, 2016
388
Apr 8, 2016
Apr 8, 2016
389
### Example
Jan 27, 2016
Jan 27, 2016
390
391
```json
Sep 7, 2016
Sep 7, 2016
392
"hooks": {
Jan 27, 2016
Jan 27, 2016
393
394
395
396
397
398
399
400
401
402
403
404
"prestart": [
{
"path": "/usr/bin/fix-mounts",
"args": ["fix-mounts", "arg1", "arg2"],
"env": [ "key1=value1"]
},
{
"path": "/usr/bin/setup-network"
}
],
"poststart": [
{
Apr 11, 2016
Apr 11, 2016
405
"path": "/usr/bin/notify-start",
Mar 16, 2016
Mar 16, 2016
406
"timeout": 5
Jan 27, 2016
Jan 27, 2016
407
408
409
410
411
412
413
414
415
416
417
}
],
"poststop": [
{
"path": "/usr/sbin/cleanup.sh",
"args": ["cleanup.sh", "-f"]
}
]
}
```
Mar 9, 2016
Mar 9, 2016
418
419
## Annotations
Sep 18, 2016
Sep 18, 2016
420
**`annotations`** (object, OPTIONAL) contains arbitrary metadata for the container.
May 23, 2016
May 23, 2016
421
This information MAY be structured or unstructured.
Jan 13, 2017
Jan 13, 2017
422
423
424
425
Annotations MUST be a key-value map.
If there are no annotations then this property MAY either be absent or an empty map.
Keys MUST be strings.
Jan 12, 2017
Jan 12, 2017
426
427
Keys MUST be unique within this map.
Keys MUST NOT be an empty string.
Sep 2, 2016
Sep 2, 2016
428
429
430
Keys SHOULD be named using a reverse domain notation - e.g. `com.example.myKey`.
Keys using the `org.opencontainers` namespace are reserved and MUST NOT be used by subsequent specifications.
Implementations that are reading/processing this configuration file MUST NOT generate an error if they encounter an unknown annotation key.
Mar 9, 2016
Mar 9, 2016
431
Jan 13, 2017
Jan 13, 2017
432
433
434
Values MUST be strings.
Values MAY be an empty string.
Mar 9, 2016
Mar 9, 2016
435
436
```json
"annotations": {
Sep 7, 2016
Sep 7, 2016
437
"com.example.gpu-cores": "2"
Mar 9, 2016
Mar 9, 2016
438
439
440
}
```
Sep 2, 2016
Sep 2, 2016
441
## Extensibility
Sep 17, 2016
Sep 17, 2016
442
Implementations that are reading/processing this configuration file MUST NOT generate an error if they encounter an unknown property.
Sep 2, 2016
Sep 2, 2016
443
444
Instead they MUST ignore unknown properties.
Mar 9, 2016
Mar 9, 2016
445
446
447
448
449
450
## Configuration Schema Example
Here is a full example `config.json` for reference.
```json
{
Apr 11, 2016
Apr 11, 2016
451
"ociVersion": "0.5.0-dev",
Mar 9, 2016
Mar 9, 2016
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
"platform": {
"os": "linux",
"arch": "amd64"
},
"process": {
"terminal": true,
"user": {
"uid": 1,
"gid": 1,
"additionalGids": [
5,
6
]
},
"args": [
"sh"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/",
Feb 22, 2017
Feb 22, 2017
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
"capabilities": {
"bounding": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"permitted": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"inheritable": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"effective": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
],
"ambient": [
"CAP_NET_BIND_SERVICE"
]
},
Mar 10, 2016
Mar 10, 2016
498
"rlimits": [
Apr 11, 2016
Apr 11, 2016
499
500
501
502
503
{
"type": "RLIMIT_CORE",
"hard": 1024,
"soft": 1024
},
Mar 10, 2016
Mar 10, 2016
504
505
506
507
508
509
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
}
],
Apr 11, 2016
Apr 11, 2016
510
511
512
"apparmorProfile": "acme_secure_profile",
"selinuxLabel": "system_u:system_r:svirt_lxc_net_t:s0:c124,c675",
"noNewPrivileges": true
Mar 9, 2016
Mar 9, 2016
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
},
"root": {
"path": "rootfs",
"readonly": true
},
"hostname": "slartibartfast",
"mounts": [
{
"destination": "/proc",
"type": "proc",
"source": "proc"
},
{
"destination": "/dev",
"type": "tmpfs",
"source": "tmpfs",
"options": [
"nosuid",
"strictatime",
"mode=755",
"size=65536k"
]
},
{
"destination": "/dev/pts",
"type": "devpts",
"source": "devpts",
"options": [
"nosuid",
"noexec",
"newinstance",
"ptmxmode=0666",
"mode=0620",
"gid=5"
]
},
{
"destination": "/dev/shm",
"type": "tmpfs",
"source": "shm",
"options": [
"nosuid",
"noexec",
"nodev",
"mode=1777",
"size=65536k"
]
},
{
"destination": "/dev/mqueue",
"type": "mqueue",
"source": "mqueue",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys",
"type": "sysfs",
"source": "sysfs",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys/fs/cgroup",
"type": "cgroup",
"source": "cgroup",
"options": [
"nosuid",
"noexec",
"nodev",
"relatime",
"ro"
]
}
],
"hooks": {
"prestart": [
{
Apr 11, 2016
Apr 11, 2016
597
"path": "/usr/bin/fix-mounts",
Mar 9, 2016
Mar 9, 2016
598
"args": [
Apr 11, 2016
Apr 11, 2016
599
600
601
"fix-mounts",
"arg1",
"arg2"
Mar 9, 2016
Mar 9, 2016
602
],
Apr 11, 2016
Apr 11, 2016
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
"env": [
"key1=value1"
]
},
{
"path": "/usr/bin/setup-network"
}
],
"poststart": [
{
"path": "/usr/bin/notify-start",
"timeout": 5
}
],
"poststop": [
{
"path": "/usr/sbin/cleanup.sh",
"args": [
"cleanup.sh",
"-f"
]
Mar 9, 2016
Mar 9, 2016
624
625
626
627
}
]
},
"linux": {
Apr 11, 2016
Apr 11, 2016
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
"devices": [
{
"path": "/dev/fuse",
"type": "c",
"major": 10,
"minor": 229,
"fileMode": 438,
"uid": 0,
"gid": 0
},
{
"path": "/dev/sda",
"type": "b",
"major": 8,
"minor": 0,
"fileMode": 432,
"uid": 0,
"gid": 0
}
],
Apr 20, 2016
Apr 20, 2016
648
649
650
651
652
653
654
655
656
657
658
659
660
661
"uidMappings": [
{
"hostID": 1000,
"containerID": 0,
"size": 32000
}
],
"gidMappings": [
{
"hostID": 1000,
"containerID": 0,
"size": 32000
}
],
Apr 11, 2016
Apr 11, 2016
662
663
664
665
666
"sysctl": {
"net.ipv4.ip_forward": "1",
"net.core.somaxconn": "256"
},
"cgroupsPath": "/myRuntime/myContainer",
Mar 9, 2016
Mar 9, 2016
667
"resources": {
Apr 11, 2016
Apr 11, 2016
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
"network": {
"classID": 1048577,
"priorities": [
{
"name": "eth0",
"priority": 500
},
{
"name": "eth1",
"priority": 1000
}
]
},
"pids": {
"limit": 32771
},
"hugepageLimits": [
{
"pageSize": "2MB",
"limit": 9223372036854772000
}
],
"oomScoreAdj": 100,
"memory": {
"limit": 536870912,
"reservation": 536870912,
"swap": 536870912,
"kernel": 0,
"kernelTCP": 0,
"swappiness": 0
},
"cpu": {
"shares": 1024,
"quota": 1000000,
"period": 500000,
"realtimeRuntime": 950000,
"realtimePeriod": 1000000,
"cpus": "2-3",
"mems": "0-7"
},
"disableOOMKiller": false,
Mar 9, 2016
Mar 9, 2016
709
710
711
712
"devices": [
{
"allow": false,
"access": "rwm"
Apr 11, 2016
Apr 11, 2016
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
},
{
"allow": true,
"type": "c",
"major": 10,
"minor": 229,
"access": "rw"
},
{
"allow": true,
"type": "b",
"major": 8,
"minor": 0,
"access": "r"
}
],
"blockIO": {
"blkioWeight": 10,
"blkioLeafWeight": 10,
"blkioWeightDevice": [
{
"major": 8,
"minor": 0,
"weight": 500,
"leafWeight": 300
},
{
"major": 8,
"minor": 16,
"weight": 500
}
],
"blkioThrottleReadBpsDevice": [
{
"major": 8,
"minor": 0,
"rate": 600
}
],
"blkioThrottleWriteIOPSDevice": [
{
"major": 8,
"minor": 16,
"rate": 300
}
]
}
},
"rootfsPropagation": "slave",
"seccomp": {
"defaultAction": "SCMP_ACT_ALLOW",
"architectures": [
"SCMP_ARCH_X86"
],
"syscalls": [
{
"name": "getcwd",
"action": "SCMP_ACT_ERRNO"
Mar 9, 2016
Mar 9, 2016
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
}
]
},
"namespaces": [
{
"type": "pid"
},
{
"type": "network"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "mount"
Jun 3, 2016
Jun 3, 2016
789
790
791
792
793
794
},
{
"type": "user"
},
{
"type": "cgroup"
Mar 9, 2016
Mar 9, 2016
795
}
Apr 11, 2016
Apr 11, 2016
796
797
798
799
800
801
802
803
804
805
806
807
808
809
],
"maskedPaths": [
"/proc/kcore",
"/proc/latency_stats",
"/proc/timer_stats",
"/proc/sched_debug"
],
"readonlyPaths": [
"/proc/asound",
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
Apr 22, 2016
Apr 22, 2016
810
811
],
"mountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c715,c811"
Apr 11, 2016
Apr 11, 2016
812
813
},
"annotations": {
Sep 2, 2016
Sep 2, 2016
814
815
"com.example.key1": "value1",
"com.example.key2": "value2"
Mar 9, 2016
Mar 9, 2016
816
}
Mar 9, 2016
Mar 9, 2016
817
818
819
}
```
Jun 2, 2016
Jun 2, 2016
820
821
[container-namespace]: glossary.md#container-namespace
[go-environment]: https://golang.org/doc/install/source#environment
Jan 4, 2017
Jan 4, 2017
822
[ieee-1003.1-2001-xbd-c8.1]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html#tag_08_01
Jan 4, 2017
Jan 4, 2017
823
[ieee-1003.1-2001-xsh-exec]: http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html
Apr 30, 2016
Apr 30, 2016
824
[runtime-namespace]: glossary.md#runtime-namespace
Oct 6, 2015
Oct 6, 2015
825
[uts-namespace]: http://man7.org/linux/man-pages/man7/namespaces.7.html
Sep 14, 2016
Sep 14, 2016
826
827
[mount.8-filesystem-independent]: http://man7.org/linux/man-pages/man8/mount.8.html#FILESYSTEM-INDEPENDENT_MOUNT%20OPTIONS
[mount.8-filesystem-specific]: http://man7.org/linux/man-pages/man8/mount.8.html#FILESYSTEM-SPECIFIC_MOUNT%20OPTIONS
Jul 22, 2016
Jul 22, 2016
828
[mount.8]: http://man7.org/linux/man-pages/man8/mount.8.html
Oct 19, 2016
Oct 19, 2016
829
[stdin.3]: http://man7.org/linux/man-pages/man3/stdin.3.html