You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The idea with a spec like this is to define behavior so that different
implementations can interoperate reliably. When there is an interop
problem betweem implementations A and B, it should be clear from the
spec whether implementation A is broken, implementation B is broken,
or the spec is insufficiently clear.
For example, pax defines 'g' and 'x' typeflags [1] that aren't part of
the older ustar (originally defined in IEEE Std 1003.1-1988) [2].
Before this commit, if implementation A produced a layer with a 'g' or
'x' typeflag and implementation B died unpacking it, it was unclear
whose fault it was. With this commit, it is clearly A's fault
(because it is using features not defined for ustar).
If implementation A had produces a layer with an '2' typeflag (which
ustar specifies for symlinks) and implementation B died unpacking it,
it is B's fault.
If implementation A had produces a layer with an 'S' typeflag (which
GNU uses for sparse files [3]) and implementation B died unpacking it,
it is neither party's fault, because ustar explicitly makes those
values implementation-defined. Interop around them is up to out of
band communication between the layer author and layer consumer, and is
not covered by this spec.
The previous "File Types" section listed sockets, but the ustar spec
has:
Attempts to archive a socket using ustar interchange format shall
produce a diagnostic message.
And I see no socket entry in Go's set of typeflag constants [4], so
I'm not sure how they were supported before.
Go has supported pax since v1.1 [5,6], and pax lets you do things
(like having symlink targets longer than 100 characters). But we're
avoiding requiring support for PAX because of name-recognition issues
[7].
[1]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_02
[2]: https://github.com/libarchive/libarchive/wiki/ManPageTar5#POSIX_ustar_Archives
[3]: https://github.com/libarchive/libarchive/wiki/ManPageTar5#gnu-tar-archives
[4]: https://golang.org/pkg/archive/tar/#pkg-constants
[5]: https://codereview.appspot.com/6700047
[6]: golang/go@1068279
[7]: opencontainers#342 (comment)
Signed-off-by: W. Trevor King <[email protected]>
Copy file name to clipboardExpand all lines: layer.md
+15-33Lines changed: 15 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,8 +6,14 @@ This document will use a concrete example to illustrate how to create and consum
6
6
7
7
## Distributable Format
8
8
9
-
Layer Changesets for the [mediatype](./media-types.md)`application/vnd.oci.image.layer.tar+gzip` MUST be packaged in [tar archive][tar-archive].
10
-
Layer Changesets for the [mediatype](./media-types.md)`application/vnd.oci.image.layer.tar+gzip` MUST NOT include duplicate entries for file paths in the resulting [tar archive][tar-archive].
9
+
Layer changesets have the [media type](media-types.md)`application/vnd.oci.image.layer.tar+gzip`.
10
+
Layer changesets SHOULD be packaged in the ustar interchange format, as [specified by IEEE Std 1003.1-2013][ustar], and MUST be compressed using gzip, as [specified by RFC 1952][rfc1952].
11
+
Layer changesets MUST NOT include duplicate entries for target paths (the value computed from `prefix` and `name` in the ustar header).
12
+
13
+
Implementations consuming layer changesets MUST be able to unpack both gzip and ustar.
14
+
Portable layers SHOULD NOT use features that [ustar][] leaves unspecified, undefined, or implementation-defined.
15
+
For example, pax [extends ustar by specifying `typeflag` values `g` and `x`][pax-header], so support for unpacking such entries may be mixed.
16
+
[Sparse files](https://en.wikipedia.org/wiki/Sparse_file) SHOULD NOT be used because they [are a GNU extension][tar.5-gnu].
11
17
12
18
## Change Types
13
19
@@ -21,33 +27,6 @@ Additions and Modifications are represented the same in the changeset tar archiv
21
27
22
28
Removals are represented using "[whiteout](#whiteouts)" file entries (See [Representing Changes](#representing-changes)).
23
29
24
-
### File Types
25
-
26
-
Throughout this document section, the use of word "files" or "entries" includes:
27
-
28
-
* regular files
29
-
* directories
30
-
* sockets
31
-
* symbolic links
32
-
* block devices
33
-
* character devices
34
-
* FIFOs
35
-
36
-
### File Attributes
37
-
38
-
Where supported, MUST include file attributes for Additions and Modifications include:
39
-
40
-
* Modification Time (`mtime`)
41
-
* User ID (`uid`)
42
-
* User Name (`uname`) *secondary to `uid`*
43
-
* Group ID (`gid `)
44
-
* Group Name (`gname`) *secondary to `gid`*
45
-
* Mode (`mode`)
46
-
* Extended Attributes (`xattrs`)
47
-
* Symlink reference (`linkname`)
48
-
49
-
[Sparse files](https://en.wikipedia.org/wiki/Sparse_file) SHOULD NOT be used because they lack consistent support across tar implementations.
50
-
51
30
## Creating
52
31
53
32
### Initial Root Filesystem
@@ -76,7 +55,7 @@ rootfs-c9d-v1/
76
55
my-app-tools
77
56
```
78
57
79
-
The `rootfs-c9d-v1` directory is then created as a plain [tar archive][tar-archive] with relative path to `rootfs-c9d-v1`.
58
+
The `rootfs-c9d-v1` directory is then created as a plain [tar archive][ustar] with paths relative to `rootfs-c9d-v1`.
80
59
Entries for the following files:
81
60
82
61
```
@@ -91,7 +70,7 @@ Entries for the following files:
91
70
### Populate a Comparison Filesystem
92
71
93
72
Create a new directory and initialize it with a copy or snapshot of the prior root filesystem.
94
-
Example commands that can preserve [file attributes](#file-attributes) to make this copy are:
73
+
Example commands that can preserve [file attributes][ustar] to make this copy are:
95
74
*[cp(1)](http://linux.die.net/man/1/cp): `cp -a rootfs-c9d-v1/ rootfs-c9d-v1.s1/`
0 commit comments