github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/image/spec/v1.1.md (about) 1 # Docker Image Specification v1.1.0 2 3 An *Image* is an ordered collection of root filesystem changes and the 4 corresponding execution parameters for use within a container runtime. This 5 specification outlines the format of these filesystem changes and corresponding 6 parameters and describes how to create and use them for use with a container 7 runtime and execution tool. 8 9 This version of the image specification was adopted starting in Docker 1.10. 10 11 ## Terminology 12 13 This specification uses the following terms: 14 15 <dl> 16 <dt> 17 Layer 18 </dt> 19 <dd> 20 Images are composed of <i>layers</i>. Each layer is a set of filesystem 21 changes. Layers do not have configuration metadata such as environment 22 variables or default arguments - these are properties of the image as a 23 whole rather than any particular layer. 24 </dd> 25 <dt> 26 Image JSON 27 </dt> 28 <dd> 29 Each image has an associated JSON structure which describes some 30 basic information about the image such as date created, author, and the 31 ID of its parent image as well as execution/runtime configuration like 32 its entry point, default arguments, CPU/memory shares, networking, and 33 volumes. The JSON structure also references a cryptographic hash of 34 each layer used by the image, and provides history information for 35 those layers. This JSON is considered to be immutable, because changing 36 it would change the computed ImageID. Changing it means creating a new 37 derived image, instead of changing the existing image. 38 </dd> 39 <dt> 40 Image Filesystem Changeset 41 </dt> 42 <dd> 43 Each layer has an archive of the files which have been added, changed, 44 or deleted relative to its parent layer. Using a layer-based or union 45 filesystem such as AUFS, or by computing the diff from filesystem 46 snapshots, the filesystem changeset can be used to present a series of 47 image layers as if they were one cohesive filesystem. 48 </dd> 49 <dt> 50 Layer DiffID 51 </dt> 52 <dd> 53 Layers are referenced by cryptographic hashes of their serialized 54 representation. This is a SHA256 digest over the tar archive used to 55 transport the layer, represented as a hexadecimal encoding of 256 bits, e.g., 56 <code>sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9</code>. 57 Layers must be packed and unpacked reproducibly to avoid changing the 58 layer ID, for example by using tar-split to save the tar headers. Note 59 that the digest used as the layer ID is taken over an uncompressed 60 version of the tar. 61 </dd> 62 <dt> 63 Layer ChainID 64 </dt> 65 <dd> 66 For convenience, it is sometimes useful to refer to a stack of layers 67 with a single identifier. This is called a <code>ChainID</code>. For a 68 single layer (or the layer at the bottom of a stack), the 69 <code>ChainID</code> is equal to the layer's <code>DiffID</code>. 70 Otherwise the <code>ChainID</code> is given by the formula: 71 <code>ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN))</code>. 72 </dd> 73 <dt> 74 ImageID <a name="id_desc"></a> 75 </dt> 76 <dd> 77 Each image's ID is given by the SHA256 hash of its configuration JSON. It is 78 represented as a hexadecimal encoding of 256 bits, e.g., 79 <code>sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9</code>. 80 Since the configuration JSON that gets hashed references hashes of each 81 layer in the image, this formulation of the ImageID makes images 82 content-addresable. 83 </dd> 84 <dt> 85 Tag 86 </dt> 87 <dd> 88 A tag serves to map a descriptive, user-given name to any single image 89 ID. Tag values are limited to the set of characters 90 <code>[a-zA-Z_0-9]</code>. 91 </dd> 92 <dt> 93 Repository 94 </dt> 95 <dd> 96 A collection of tags grouped under a common prefix (the name component 97 before <code>:</code>). For example, in an image tagged with the name 98 <code>my-app:3.1.4</code>, <code>my-app</code> is the <i>Repository</i> 99 component of the name. A repository name is made up of slash-separated 100 name components, optionally prefixed by a DNS hostname. The hostname 101 must follow comply with standard DNS rules, but may not contain 102 <code>_</code> characters. If a hostname is present, it may optionally 103 be followed by a port number in the format <code>:8080</code>. 104 Name components may contain lowercase characters, digits, and 105 separators. A separator is defined as a period, one or two underscores, 106 or one or more dashes. A name component may not start or end with 107 a separator. 108 </dd> 109 </dl> 110 111 ## Image JSON Description 112 113 Here is an example image JSON file: 114 115 ``` 116 { 117 "created": "2015-10-31T22:22:56.015925234Z", 118 "author": "Alyssa P. Hacker <alyspdev@example.com>", 119 "architecture": "amd64", 120 "os": "linux", 121 "config": { 122 "User": "alice", 123 "Memory": 2048, 124 "MemorySwap": 4096, 125 "CpuShares": 8, 126 "ExposedPorts": { 127 "8080/tcp": {} 128 }, 129 "Env": [ 130 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 131 "FOO=docker_is_a_really", 132 "BAR=great_tool_you_know" 133 ], 134 "Entrypoint": [ 135 "/bin/my-app-binary" 136 ], 137 "Cmd": [ 138 "--foreground", 139 "--config", 140 "/etc/my-app.d/default.cfg" 141 ], 142 "Volumes": { 143 "/var/job-result-data": {}, 144 "/var/log/my-app-logs": {}, 145 }, 146 "WorkingDir": "/home/alice", 147 }, 148 "rootfs": { 149 "diff_ids": [ 150 "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", 151 "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" 152 ], 153 "type": "layers" 154 }, 155 "history": [ 156 { 157 "created": "2015-10-31T22:22:54.690851953Z", 158 "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" 159 }, 160 { 161 "created": "2015-10-31T22:22:55.613815829Z", 162 "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", 163 "empty_layer": true 164 } 165 ] 166 } 167 ``` 168 169 Note that image JSON files produced by Docker don't contain formatting 170 whitespace. It has been added to this example for clarity. 171 172 ### Image JSON Field Descriptions 173 174 <dl> 175 <dt> 176 created <code>string</code> 177 </dt> 178 <dd> 179 ISO-8601 formatted combined date and time at which the image was 180 created. 181 </dd> 182 <dt> 183 author <code>string</code> 184 </dt> 185 <dd> 186 Gives the name and/or email address of the person or entity which 187 created and is responsible for maintaining the image. 188 </dd> 189 <dt> 190 architecture <code>string</code> 191 </dt> 192 <dd> 193 The CPU architecture which the binaries in this image are built to run 194 on. Possible values include: 195 <ul> 196 <li>386</li> 197 <li>amd64</li> 198 <li>arm</li> 199 </ul> 200 More values may be supported in the future and any of these may or may 201 not be supported by a given container runtime implementation. 202 </dd> 203 <dt> 204 os <code>string</code> 205 </dt> 206 <dd> 207 The name of the operating system which the image is built to run on. 208 Possible values include: 209 <ul> 210 <li>darwin</li> 211 <li>freebsd</li> 212 <li>linux</li> 213 </ul> 214 More values may be supported in the future and any of these may or may 215 not be supported by a given container runtime implementation. 216 </dd> 217 <dt> 218 config <code>struct</code> 219 </dt> 220 <dd> 221 The execution parameters which should be used as a base when running a 222 container using the image. This field can be <code>null</code>, in 223 which case any execution parameters should be specified at creation of 224 the container. 225 226 <h4>Container RunConfig Field Descriptions</h4> 227 228 <dl> 229 <dt> 230 User <code>string</code> 231 </dt> 232 <dd> 233 <p>The username or UID which the process in the container should 234 run as. This acts as a default value to use when the value is 235 not specified when creating a container.</p> 236 237 <p>All of the following are valid:</p> 238 239 <ul> 240 <li><code>user</code></li> 241 <li><code>uid</code></li> 242 <li><code>user:group</code></li> 243 <li><code>uid:gid</code></li> 244 <li><code>uid:group</code></li> 245 <li><code>user:gid</code></li> 246 </ul> 247 248 <p>If <code>group</code>/<code>gid</code> is not specified, the 249 default group and supplementary groups of the given 250 <code>user</code>/<code>uid</code> in <code>/etc/passwd</code> 251 from the container are applied.</p> 252 </dd> 253 <dt> 254 Memory <code>integer</code> 255 </dt> 256 <dd> 257 Memory limit (in bytes). This acts as a default value to use 258 when the value is not specified when creating a container. 259 </dd> 260 <dt> 261 MemorySwap <code>integer</code> 262 </dt> 263 <dd> 264 Total memory usage (memory + swap); set to <code>-1</code> to 265 disable swap. This acts as a default value to use when the 266 value is not specified when creating a container. 267 </dd> 268 <dt> 269 CpuShares <code>integer</code> 270 </dt> 271 <dd> 272 CPU shares (relative weight vs. other containers). This acts as 273 a default value to use when the value is not specified when 274 creating a container. 275 </dd> 276 <dt> 277 ExposedPorts <code>struct</code> 278 </dt> 279 <dd> 280 A set of ports to expose from a container running this image. 281 This JSON structure value is unusual because it is a direct 282 JSON serialization of the Go type 283 <code>map[string]struct{}</code> and is represented in JSON as 284 an object mapping its keys to an empty object. Here is an 285 example: 286 287 <pre>{ 288 "8080": {}, 289 "53/udp": {}, 290 "2356/tcp": {} 291 }</pre> 292 293 Its keys can be in the format of: 294 <ul> 295 <li> 296 <code>"port/tcp"</code> 297 </li> 298 <li> 299 <code>"port/udp"</code> 300 </li> 301 <li> 302 <code>"port"</code> 303 </li> 304 </ul> 305 with the default protocol being <code>"tcp"</code> if not 306 specified. 307 308 These values act as defaults and are merged with any specified 309 when creating a container. 310 </dd> 311 <dt> 312 Env <code>array of strings</code> 313 </dt> 314 <dd> 315 Entries are in the format of <code>VARNAME="var value"</code>. 316 These values act as defaults and are merged with any specified 317 when creating a container. 318 </dd> 319 <dt> 320 Entrypoint <code>array of strings</code> 321 </dt> 322 <dd> 323 A list of arguments to use as the command to execute when the 324 container starts. This value acts as a default and is replaced 325 by an entrypoint specified when creating a container. 326 </dd> 327 <dt> 328 Cmd <code>array of strings</code> 329 </dt> 330 <dd> 331 Default arguments to the entry point of the container. These 332 values act as defaults and are replaced with any specified when 333 creating a container. If an <code>Entrypoint</code> value is 334 not specified, then the first entry of the <code>Cmd</code> 335 array should be interpreted as the executable to run. 336 </dd> 337 <dt> 338 Volumes <code>struct</code> 339 </dt> 340 <dd> 341 A set of directories which should be created as data volumes in 342 a container running this image. This JSON structure value is 343 unusual because it is a direct JSON serialization of the Go 344 type <code>map[string]struct{}</code> and is represented in 345 JSON as an object mapping its keys to an empty object. Here is 346 an example: 347 <pre>{ 348 "/var/my-app-data/": {}, 349 "/etc/some-config.d/": {}, 350 }</pre> 351 </dd> 352 <dt> 353 WorkingDir <code>string</code> 354 </dt> 355 <dd> 356 Sets the current working directory of the entry point process 357 in the container. This value acts as a default and is replaced 358 by a working directory specified when creating a container. 359 </dd> 360 </dl> 361 </dd> 362 <dt> 363 rootfs <code>struct</code> 364 </dt> 365 <dd> 366 The rootfs key references the layer content addresses used by the 367 image. This makes the image config hash depend on the filesystem hash. 368 rootfs has two subkeys: 369 370 <ul> 371 <li> 372 <code>type</code> is usually set to <code>layers</code>. There is 373 also a Windows-specific value <code>layers+base</code> that allows 374 a base layer to be specified in a field of <code>rootfs</code> 375 called <code>base_layer</code>. 376 </li> 377 <li> 378 <code>diff_ids</code> is an array of layer content hashes (<code>DiffIDs</code>), in order from bottom-most to top-most. 379 </li> 380 </ul> 381 382 383 Here is an example rootfs section: 384 385 <pre>"rootfs": { 386 "diff_ids": [ 387 "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", 388 "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef", 389 "sha256:13f53e08df5a220ab6d13c58b2bf83a59cbdc2e04d0a3f041ddf4b0ba4112d49" 390 ], 391 "type": "layers" 392 }</pre> 393 </dd> 394 <dt> 395 history <code>struct</code> 396 </dt> 397 <dd> 398 <code>history</code> is an array of objects describing the history of 399 each layer. The array is ordered from bottom-most layer to top-most 400 layer. The object has the following fields. 401 402 <ul> 403 <li> 404 <code>created</code>: Creation time, expressed as a ISO-8601 formatted 405 combined date and time 406 </li> 407 <li> 408 <code>author</code>: The author of the build point 409 </li> 410 <li> 411 <code>created_by</code>: The command which created the layer 412 </li> 413 <li> 414 <code>comment</code>: A custom message set when creating the layer 415 </li> 416 <li> 417 <code>empty_layer</code>: This field is used to mark if the history 418 item created a filesystem diff. It is set to true if this history 419 item doesn't correspond to an actual layer in the rootfs section 420 (for example, a command like ENV which results in no change to the 421 filesystem). 422 </li> 423 </ul> 424 425 Here is an example history section: 426 427 <pre>"history": [ 428 { 429 "created": "2015-10-31T22:22:54.690851953Z", 430 "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" 431 }, 432 { 433 "created": "2015-10-31T22:22:55.613815829Z", 434 "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", 435 "empty_layer": true 436 } 437 ]</pre> 438 </dd> 439 </dl> 440 441 Any extra fields in the Image JSON struct are considered implementation 442 specific and should be ignored by any implementations which are unable to 443 interpret them. 444 445 ## Creating an Image Filesystem Changeset 446 447 An example of creating an Image Filesystem Changeset follows. 448 449 An image root filesystem is first created as an empty directory. Here is the 450 initial empty directory structure for the a changeset using the 451 randomly-generated directory name `c3167915dc9d` ([actual layer DiffIDs are 452 generated based on the content](#id_desc)). 453 454 ``` 455 c3167915dc9d/ 456 ``` 457 458 Files and directories are then created: 459 460 ``` 461 c3167915dc9d/ 462 etc/ 463 my-app-config 464 bin/ 465 my-app-binary 466 my-app-tools 467 ``` 468 469 The `c3167915dc9d` directory is then committed as a plain Tar archive with 470 entries for the following files: 471 472 ``` 473 etc/my-app-config 474 bin/my-app-binary 475 bin/my-app-tools 476 ``` 477 478 To make changes to the filesystem of this container image, create a new 479 directory, such as `f60c56784b83`, and initialize it with a snapshot of the 480 parent image's root filesystem, so that the directory is identical to that 481 of `c3167915dc9d`. NOTE: a copy-on-write or union filesystem can make this very 482 efficient: 483 484 ``` 485 f60c56784b83/ 486 etc/ 487 my-app-config 488 bin/ 489 my-app-binary 490 my-app-tools 491 ``` 492 493 This example change is going add a configuration directory at `/etc/my-app.d` 494 which contains a default config file. There's also a change to the 495 `my-app-tools` binary to handle the config layout change. The `f60c56784b83` 496 directory then looks like this: 497 498 ``` 499 f60c56784b83/ 500 etc/ 501 my-app.d/ 502 default.cfg 503 bin/ 504 my-app-binary 505 my-app-tools 506 ``` 507 508 This reflects the removal of `/etc/my-app-config` and creation of a file and 509 directory at `/etc/my-app.d/default.cfg`. `/bin/my-app-tools` has also been 510 replaced with an updated version. Before committing this directory to a 511 changeset, because it has a parent image, it is first compared with the 512 directory tree of the parent snapshot, `f60c56784b83`, looking for files and 513 directories that have been added, modified, or removed. The following changeset 514 is found: 515 516 ``` 517 Added: /etc/my-app.d/default.cfg 518 Modified: /bin/my-app-tools 519 Deleted: /etc/my-app-config 520 ``` 521 522 A Tar Archive is then created which contains *only* this changeset: The added 523 and modified files and directories in their entirety, and for each deleted item 524 an entry for an empty file at the same location but with the basename of the 525 deleted file or directory prefixed with `.wh.`. The filenames prefixed with 526 `.wh.` are known as "whiteout" files. NOTE: For this reason, it is not possible 527 to create an image root filesystem which contains a file or directory with a 528 name beginning with `.wh.`. The resulting Tar archive for `f60c56784b83` has 529 the following entries: 530 531 ``` 532 /etc/my-app.d/default.cfg 533 /bin/my-app-tools 534 /etc/.wh.my-app-config 535 ``` 536 537 Any given image is likely to be composed of several of these Image Filesystem 538 Changeset tar archives. 539 540 ## Combined Image JSON + Filesystem Changeset Format 541 542 There is also a format for a single archive which contains complete information 543 about an image, including: 544 545 - repository names/tags 546 - image configuration JSON file 547 - all tar archives of each layer filesystem changesets 548 549 For example, here's what the full archive of `library/busybox` is (displayed in 550 `tree` format): 551 552 ``` 553 . 554 ├── 47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json 555 ├── 5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a 556 │ ├── VERSION 557 │ ├── json 558 │ └── layer.tar 559 ├── a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198 560 │ ├── VERSION 561 │ ├── json 562 │ └── layer.tar 563 ├── manifest.json 564 └── repositories 565 ``` 566 567 There is a directory for each layer in the image. Each directory is named with 568 a 64 character hex name that is deterministically generated from the layer 569 information. These names are not necessarily layer DiffIDs or ChainIDs. Each of 570 these directories contains 3 files: 571 572 * `VERSION` - The schema version of the `json` file 573 * `json` - The legacy JSON metadata for an image layer. In this version of 574 the image specification, layers don't have JSON metadata, but in 575 [version 1](v1.md), they did. A file is created for each layer in the 576 v1 format for backward compatiblity. 577 * `layer.tar` - The Tar archive of the filesystem changeset for an image 578 layer. 579 580 Note that this directory layout is only important for backward compatibility. 581 Current implementations use the paths specified in `manifest.json`. 582 583 The content of the `VERSION` files is simply the semantic version of the JSON 584 metadata schema: 585 586 ``` 587 1.0 588 ``` 589 590 The `repositories` file is another JSON file which describes names/tags: 591 592 ``` 593 { 594 "busybox":{ 595 "latest":"5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a" 596 } 597 } 598 ``` 599 600 Every key in this object is the name of a repository, and maps to a collection 601 of tag suffixes. Each tag maps to the ID of the image represented by that tag. 602 This file is only used for backwards compatibility. Current implementations use 603 the `manifest.json` file instead. 604 605 The `manifest.json` file provides the image JSON for the top-level image, and 606 optionally for parent images that this image was derived from. It consists of 607 an array of metadata entries: 608 609 ``` 610 [ 611 { 612 "Config": "47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json", 613 "RepoTags": ["busybox:latest"], 614 "Layers": [ 615 "a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198/layer.tar", 616 "5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a/layer.tar" 617 ] 618 } 619 ] 620 ``` 621 622 There is an entry in the array for each image. 623 624 The `Config` field references another file in the tar which includes the image 625 JSON for this image. 626 627 The `RepoTags` field lists references pointing to this image. 628 629 The `Layers` field points to the filesystem changeset tars. 630 631 An optional `Parent` field references the imageID of the parent image. This 632 parent must be part of the same `manifest.json` file. 633 634 This file shouldn't be confused with the distribution manifest, used to push 635 and pull images. 636 637 Generally, implementations that support this version of the spec will use 638 the `manifest.json` file if available, and older implementations will use the 639 legacy `*/json` files and `repositories`.