Fossil SCM

Added section numbers to the containers doc (it was getting confusing) and added a few internal fragment IDs.

wyoung 2022-09-04 11:36 trunk
Commit 4d51d52417a3ec058c327274279ec398dc1f6515d61163cc1670165779b7ca8e
1 file changed +20 -20
+20 -20
--- www/containers.md
+++ www/containers.md
@@ -8,11 +8,11 @@
88
99
[Docker]: https://www.docker.com/
1010
[OCI]: https://opencontainers.org/
1111
1212
13
-## Quick Start
13
+## 1. Quick Start
1414
1515
Fossil ships a `Dockerfile` at the top of its source tree which you can
1616
build like so:
1717
1818
```
@@ -57,11 +57,11 @@
5757
applications since they avoid a conflict with past versions; it lets you
5858
keep old containers around for quick roll-backs while replacing them
5959
with fresh ones.
6060
6161
62
-## <a id="storage"></a>Repository Storage Options
62
+## 2. <a id="storage"></a>Repository Storage Options
6363
6464
If you want the container to serve an existing repository, there are at
6565
least two right ways to do it.
6666
6767
The wrong way is to use the `Dockerfile COPY` command, because by baking
@@ -74,11 +74,11 @@
7474
7575
The correct ways put the repo into the _container_ created from the
7676
_image_, not in the image itself.
7777
7878
79
-### Storing the Repo Inside the Container
79
+### <a id="repo-inside"></a> 2.1 Storing the Repo Inside the Container
8080
8181
The simplest method is to stop the container if it was running, then
8282
say:
8383
8484
```
@@ -110,11 +110,11 @@
110110
privileges after it enters the chroot. (See [below](#args) for how to
111111
change this default.) You don’t have to restart the server after fixing
112112
this with `chmod`: simply reload the browser, and Fossil will try again.
113113
114114
115
-### <a id="bind-mount"></a>Storing the Repo Outside the Container
115
+### 2.2 <a id="bind-mount"></a>Storing the Repo Outside the Container
116116
117117
The simple storage method above has a problem: Docker containers are
118118
designed to be killed off at the slightest cause, rebuilt, and
119119
redeployed. If you do that with the repo inside the container, it gets
120120
destroyed, too. The solution is to replace the “run” command above with
@@ -145,13 +145,13 @@
145145
remapped into the new container when you recreate it with `-v`.
146146
147147
[dbcorr]: https://www.sqlite.org/howtocorrupt.html
148148
149149
150
-## <a id="security"></a>Security
150
+## 3. <a id="security"></a>Security
151151
152
-### <a id="chroot"></a>Why Chroot?
152
+### 3.1 <a id="chroot"></a>Why Chroot?
153153
154154
A potentially surprising feature of this container is that it runs
155155
Fossil as root. Since that causes [the chroot jail feature](./chroot.md)
156156
to kick in, and a Docker container is a type of über-jail already, you
157157
may be wondering why we bother. Instead, why not either:
@@ -196,11 +196,11 @@
196196
become when dropping root privileges.
197197
198198
[th1docrisk]: https://fossil-scm.org/forum/forumpost/42e0c16544
199199
200200
201
-### <a id="caps"></a>Dropping Unnecessary Capabilities
201
+### 3.2 <a id="caps"></a>Dropping Unnecessary Capabilities
202202
203203
The example commands above create the container with [a default set of
204204
Linux kernel capabilities][defcap]. Although Docker strips away almost
205205
all of the traditional root capabilities by default, and Fossil doesn’t
206206
need any of those it does take away, Docker does leave some enabled that
@@ -310,11 +310,11 @@
310310
[defcap]: https://docs.docker.com/engine/security/#linux-kernel-capabilities
311311
[capchg]: https://stackoverflow.com/a/45752205/142454
312312
313313
314314
315
-## <a id="static"></a>Extracting a Static Binary
315
+## 4. <a id="static"></a>Extracting a Static Binary
316316
317317
Our 2-stage build process uses Alpine Linux only as a build host. Once
318318
we’ve got everything reduced to the two key static binaries — Fossil and
319319
BusyBox — we throw all the rest of it away.
320320
@@ -336,13 +336,13 @@
336336
at about 4 MiB. (It’s built stripped and packed with [UPX].)
337337
338338
[UPX]: https://upx.github.io/
339339
340340
341
-## <a id="args"></a>Container Build Arguments
341
+## 5. <a id="args"></a>Container Build Arguments
342342
343
-### Package Versions
343
+### <a id="pkg-vers"></a> 5.1 Package Versions
344344
345345
You can override the default versions of Fossil and BusyBox that get
346346
fetched in the build step. To get the latest-and-greatest of everything,
347347
you could say:
348348
@@ -383,11 +383,11 @@
383383
rather than let it default to the generic “`trunk`” tag: so the URL will
384384
change each time you update your Fossil source tree, forcing Docker to
385385
pull a fresh tarball.
386386
387387
388
-### <a id="uids"></a>User & Group IDs
388
+### 5.2 <a id="uids"></a>User & Group IDs
389389
390390
The “`fossil`” user and group IDs inside the container default to 499.
391391
Why? Regular user IDs start at 500 or 1000 on most Unix type systems,
392392
leaving those below it for system users like this Fossil daemon owner.
393393
Since it’s typical for these to start at 0 and go upward, we started at
@@ -405,11 +405,11 @@
405405
file permissions. You may therefore wish them to mean something on both
406406
sides of the container barrier rather than have “499” appear on the host
407407
in “`ls -l`” output.
408408
409409
410
-## <a id="light"></a>Lightweight Alternatives to Docker
410
+## 6. <a id="light"></a>Lightweight Alternatives to Docker
411411
412412
Those afflicted with sticker shock at seeing the size of a [Docker
413413
Desktop][DD] installation — 1.65 GB here — might’ve immediately
414414
“noped” out of the whole concept of containers. The first thing to
415415
realize is that when it comes to actually serving simple containers like
@@ -445,11 +445,11 @@
445445
[DD]: https://www.docker.com/products/docker-desktop/
446446
[DE]: https://docs.docker.com/engine/
447447
[DNT]: ./server/debian/nginx.md
448448
449449
450
-### <a id="runc" name="containerd"></a>Stripping Docker Engine Down
450
+### 6.1 <a id="runc" name="containerd"></a>Stripping Docker Engine Down
451451
452452
The core of Docker Engine is its [`containerd`][ctrd] daemon and the
453453
[`runc`][runc] container runner. It’s possible to dig into the subtree
454454
managed by `containerd` on the build host and extract what we need to
455455
run our Fossil container elsewhere with `runc`, leaving out all the
@@ -652,11 +652,11 @@
652652
[jq]: https://stedolan.github.io/jq/
653653
[sdnsp]: #nspawn
654654
[runc]: https://github.com/opencontainers/runc
655655
656656
657
-### <a id="podman"></a>Podman
657
+### 6.2 <a id="podman"></a>Podman
658658
659659
Although your humble author claims the `runc` methods above are not
660660
complicated, merely cryptic, you might be fondly recollecting the
661661
carefree commands at the top of this document, pondering whether you can
662662
live without the abstractions a proper container runtime system
@@ -697,11 +697,11 @@
697697
[pmwin]: https://github.com/containers/podman/blob/main/docs/tutorials/podman-for-windows.md
698698
[Podman]: https://podman.io/
699699
[whatis]: https://podman.io/whatis.html
700700
701701
702
-#### <a id="podman-rootless"></a>Fossil in a Rootless Podman Container
702
+#### 6.2.1 <a id="podman-rootless"></a>Fossil in a Rootless Podman Container
703703
704704
If you build the stock Fossil container under `podman`, it will fail at
705705
two key steps:
706706
707707
1. The `mknod` calls in the second stage, which create the `/jail/dev`
@@ -742,11 +742,11 @@
742742
they’ll be connected to the network the container runs on. Once the bad
743743
guy is inside the house, he doesn’t necessarily have to go after the
744744
residents directly to cause problems for them.
745745
746746
747
-#### <a id="crun"></a>`crun`
747
+#### 6.2.2 <a id="crun"></a>`crun`
748748
749749
In the same way that [Docker Engine is based on `runc`](#runc), Podman’s
750750
engine is based on [`crun`][crun], a lighter-weight alternative to
751751
`runc`. It’s only 1.4 MiB on the system I tested it on, yet it will run
752752
the same container bundles as in my `runc` examples above.
@@ -762,11 +762,11 @@
762762
`sudo crun`, following the examples above.
763763
764764
[crun]: https://github.com/containers/crun
765765
766766
767
-#### <a id="podman-rootful"></a>Fossil in a Rootful Podman Container
767
+#### 6.2.3 <a id="podman-rootful"></a>Fossil in a Rootful Podman Container
768768
769769
##### Simple Method
770770
771771
As we saw above with `runc`, switching to `crun` just to get your
772772
containers to run as root loses a lot of functionality and requires a
@@ -831,12 +831,12 @@
831831
remote system. You still have to build as root on the local system, but
832832
as I said above, Docker already does this. What we’re doing is shifting
833833
the risk of running as root from the public host to the local one.
834834
835835
Once you have the image built on the local machine, create a “`fossil`”
836
-repository on your container repository of choice, such as [Docker
837
-Hub](https://hub.docker.com). Then say:
836
+repository on your container repository of choice such as [Docker
837
+Hub](https://hub.docker.com), then say:
838838
839839
```
840840
$ docker login
841841
$ docker tag fossil:latest mydockername/fossil:latest
842842
$ docker image push mydockername/fossil:latest
@@ -857,11 +857,11 @@
857857
container images across the Internet, it can be a net win in terms of
858858
build time.
859859
860860
861861
862
-### <a id="nspawn"></a>`systemd-nspawn`
862
+### 6.3 <a id="nspawn"></a>`systemd-nspawn`
863863
864864
As of `systemd` version 242, its optional `nspawn` piece
865865
[reportedly](https://www.phoronix.com/news/Systemd-Nspawn-OCI-Runtime)
866866
now has the ability to run OCI container bundles directly. You might
867867
have it installed already, but if not, it’s only about 2 MiB. It’s
868868
--- www/containers.md
+++ www/containers.md
@@ -8,11 +8,11 @@
8
9 [Docker]: https://www.docker.com/
10 [OCI]: https://opencontainers.org/
11
12
13 ## Quick Start
14
15 Fossil ships a `Dockerfile` at the top of its source tree which you can
16 build like so:
17
18 ```
@@ -57,11 +57,11 @@
57 applications since they avoid a conflict with past versions; it lets you
58 keep old containers around for quick roll-backs while replacing them
59 with fresh ones.
60
61
62 ## <a id="storage"></a>Repository Storage Options
63
64 If you want the container to serve an existing repository, there are at
65 least two right ways to do it.
66
67 The wrong way is to use the `Dockerfile COPY` command, because by baking
@@ -74,11 +74,11 @@
74
75 The correct ways put the repo into the _container_ created from the
76 _image_, not in the image itself.
77
78
79 ### Storing the Repo Inside the Container
80
81 The simplest method is to stop the container if it was running, then
82 say:
83
84 ```
@@ -110,11 +110,11 @@
110 privileges after it enters the chroot. (See [below](#args) for how to
111 change this default.) You don’t have to restart the server after fixing
112 this with `chmod`: simply reload the browser, and Fossil will try again.
113
114
115 ### <a id="bind-mount"></a>Storing the Repo Outside the Container
116
117 The simple storage method above has a problem: Docker containers are
118 designed to be killed off at the slightest cause, rebuilt, and
119 redeployed. If you do that with the repo inside the container, it gets
120 destroyed, too. The solution is to replace the “run” command above with
@@ -145,13 +145,13 @@
145 remapped into the new container when you recreate it with `-v`.
146
147 [dbcorr]: https://www.sqlite.org/howtocorrupt.html
148
149
150 ## <a id="security"></a>Security
151
152 ### <a id="chroot"></a>Why Chroot?
153
154 A potentially surprising feature of this container is that it runs
155 Fossil as root. Since that causes [the chroot jail feature](./chroot.md)
156 to kick in, and a Docker container is a type of über-jail already, you
157 may be wondering why we bother. Instead, why not either:
@@ -196,11 +196,11 @@
196 become when dropping root privileges.
197
198 [th1docrisk]: https://fossil-scm.org/forum/forumpost/42e0c16544
199
200
201 ### <a id="caps"></a>Dropping Unnecessary Capabilities
202
203 The example commands above create the container with [a default set of
204 Linux kernel capabilities][defcap]. Although Docker strips away almost
205 all of the traditional root capabilities by default, and Fossil doesn’t
206 need any of those it does take away, Docker does leave some enabled that
@@ -310,11 +310,11 @@
310 [defcap]: https://docs.docker.com/engine/security/#linux-kernel-capabilities
311 [capchg]: https://stackoverflow.com/a/45752205/142454
312
313
314
315 ## <a id="static"></a>Extracting a Static Binary
316
317 Our 2-stage build process uses Alpine Linux only as a build host. Once
318 we’ve got everything reduced to the two key static binaries — Fossil and
319 BusyBox — we throw all the rest of it away.
320
@@ -336,13 +336,13 @@
336 at about 4 MiB. (It’s built stripped and packed with [UPX].)
337
338 [UPX]: https://upx.github.io/
339
340
341 ## <a id="args"></a>Container Build Arguments
342
343 ### Package Versions
344
345 You can override the default versions of Fossil and BusyBox that get
346 fetched in the build step. To get the latest-and-greatest of everything,
347 you could say:
348
@@ -383,11 +383,11 @@
383 rather than let it default to the generic “`trunk`” tag: so the URL will
384 change each time you update your Fossil source tree, forcing Docker to
385 pull a fresh tarball.
386
387
388 ### <a id="uids"></a>User & Group IDs
389
390 The “`fossil`” user and group IDs inside the container default to 499.
391 Why? Regular user IDs start at 500 or 1000 on most Unix type systems,
392 leaving those below it for system users like this Fossil daemon owner.
393 Since it’s typical for these to start at 0 and go upward, we started at
@@ -405,11 +405,11 @@
405 file permissions. You may therefore wish them to mean something on both
406 sides of the container barrier rather than have “499” appear on the host
407 in “`ls -l`” output.
408
409
410 ## <a id="light"></a>Lightweight Alternatives to Docker
411
412 Those afflicted with sticker shock at seeing the size of a [Docker
413 Desktop][DD] installation — 1.65 GB here — might’ve immediately
414 “noped” out of the whole concept of containers. The first thing to
415 realize is that when it comes to actually serving simple containers like
@@ -445,11 +445,11 @@
445 [DD]: https://www.docker.com/products/docker-desktop/
446 [DE]: https://docs.docker.com/engine/
447 [DNT]: ./server/debian/nginx.md
448
449
450 ### <a id="runc" name="containerd"></a>Stripping Docker Engine Down
451
452 The core of Docker Engine is its [`containerd`][ctrd] daemon and the
453 [`runc`][runc] container runner. It’s possible to dig into the subtree
454 managed by `containerd` on the build host and extract what we need to
455 run our Fossil container elsewhere with `runc`, leaving out all the
@@ -652,11 +652,11 @@
652 [jq]: https://stedolan.github.io/jq/
653 [sdnsp]: #nspawn
654 [runc]: https://github.com/opencontainers/runc
655
656
657 ### <a id="podman"></a>Podman
658
659 Although your humble author claims the `runc` methods above are not
660 complicated, merely cryptic, you might be fondly recollecting the
661 carefree commands at the top of this document, pondering whether you can
662 live without the abstractions a proper container runtime system
@@ -697,11 +697,11 @@
697 [pmwin]: https://github.com/containers/podman/blob/main/docs/tutorials/podman-for-windows.md
698 [Podman]: https://podman.io/
699 [whatis]: https://podman.io/whatis.html
700
701
702 #### <a id="podman-rootless"></a>Fossil in a Rootless Podman Container
703
704 If you build the stock Fossil container under `podman`, it will fail at
705 two key steps:
706
707 1. The `mknod` calls in the second stage, which create the `/jail/dev`
@@ -742,11 +742,11 @@
742 they’ll be connected to the network the container runs on. Once the bad
743 guy is inside the house, he doesn’t necessarily have to go after the
744 residents directly to cause problems for them.
745
746
747 #### <a id="crun"></a>`crun`
748
749 In the same way that [Docker Engine is based on `runc`](#runc), Podman’s
750 engine is based on [`crun`][crun], a lighter-weight alternative to
751 `runc`. It’s only 1.4 MiB on the system I tested it on, yet it will run
752 the same container bundles as in my `runc` examples above.
@@ -762,11 +762,11 @@
762 `sudo crun`, following the examples above.
763
764 [crun]: https://github.com/containers/crun
765
766
767 #### <a id="podman-rootful"></a>Fossil in a Rootful Podman Container
768
769 ##### Simple Method
770
771 As we saw above with `runc`, switching to `crun` just to get your
772 containers to run as root loses a lot of functionality and requires a
@@ -831,12 +831,12 @@
831 remote system. You still have to build as root on the local system, but
832 as I said above, Docker already does this. What we’re doing is shifting
833 the risk of running as root from the public host to the local one.
834
835 Once you have the image built on the local machine, create a “`fossil`”
836 repository on your container repository of choice, such as [Docker
837 Hub](https://hub.docker.com). Then say:
838
839 ```
840 $ docker login
841 $ docker tag fossil:latest mydockername/fossil:latest
842 $ docker image push mydockername/fossil:latest
@@ -857,11 +857,11 @@
857 container images across the Internet, it can be a net win in terms of
858 build time.
859
860
861
862 ### <a id="nspawn"></a>`systemd-nspawn`
863
864 As of `systemd` version 242, its optional `nspawn` piece
865 [reportedly](https://www.phoronix.com/news/Systemd-Nspawn-OCI-Runtime)
866 now has the ability to run OCI container bundles directly. You might
867 have it installed already, but if not, it’s only about 2 MiB. It’s
868
--- www/containers.md
+++ www/containers.md
@@ -8,11 +8,11 @@
8
9 [Docker]: https://www.docker.com/
10 [OCI]: https://opencontainers.org/
11
12
13 ## 1. Quick Start
14
15 Fossil ships a `Dockerfile` at the top of its source tree which you can
16 build like so:
17
18 ```
@@ -57,11 +57,11 @@
57 applications since they avoid a conflict with past versions; it lets you
58 keep old containers around for quick roll-backs while replacing them
59 with fresh ones.
60
61
62 ## 2. <a id="storage"></a>Repository Storage Options
63
64 If you want the container to serve an existing repository, there are at
65 least two right ways to do it.
66
67 The wrong way is to use the `Dockerfile COPY` command, because by baking
@@ -74,11 +74,11 @@
74
75 The correct ways put the repo into the _container_ created from the
76 _image_, not in the image itself.
77
78
79 ### <a id="repo-inside"></a> 2.1 Storing the Repo Inside the Container
80
81 The simplest method is to stop the container if it was running, then
82 say:
83
84 ```
@@ -110,11 +110,11 @@
110 privileges after it enters the chroot. (See [below](#args) for how to
111 change this default.) You don’t have to restart the server after fixing
112 this with `chmod`: simply reload the browser, and Fossil will try again.
113
114
115 ### 2.2 <a id="bind-mount"></a>Storing the Repo Outside the Container
116
117 The simple storage method above has a problem: Docker containers are
118 designed to be killed off at the slightest cause, rebuilt, and
119 redeployed. If you do that with the repo inside the container, it gets
120 destroyed, too. The solution is to replace the “run” command above with
@@ -145,13 +145,13 @@
145 remapped into the new container when you recreate it with `-v`.
146
147 [dbcorr]: https://www.sqlite.org/howtocorrupt.html
148
149
150 ## 3. <a id="security"></a>Security
151
152 ### 3.1 <a id="chroot"></a>Why Chroot?
153
154 A potentially surprising feature of this container is that it runs
155 Fossil as root. Since that causes [the chroot jail feature](./chroot.md)
156 to kick in, and a Docker container is a type of über-jail already, you
157 may be wondering why we bother. Instead, why not either:
@@ -196,11 +196,11 @@
196 become when dropping root privileges.
197
198 [th1docrisk]: https://fossil-scm.org/forum/forumpost/42e0c16544
199
200
201 ### 3.2 <a id="caps"></a>Dropping Unnecessary Capabilities
202
203 The example commands above create the container with [a default set of
204 Linux kernel capabilities][defcap]. Although Docker strips away almost
205 all of the traditional root capabilities by default, and Fossil doesn’t
206 need any of those it does take away, Docker does leave some enabled that
@@ -310,11 +310,11 @@
310 [defcap]: https://docs.docker.com/engine/security/#linux-kernel-capabilities
311 [capchg]: https://stackoverflow.com/a/45752205/142454
312
313
314
315 ## 4. <a id="static"></a>Extracting a Static Binary
316
317 Our 2-stage build process uses Alpine Linux only as a build host. Once
318 we’ve got everything reduced to the two key static binaries — Fossil and
319 BusyBox — we throw all the rest of it away.
320
@@ -336,13 +336,13 @@
336 at about 4 MiB. (It’s built stripped and packed with [UPX].)
337
338 [UPX]: https://upx.github.io/
339
340
341 ## 5. <a id="args"></a>Container Build Arguments
342
343 ### <a id="pkg-vers"></a> 5.1 Package Versions
344
345 You can override the default versions of Fossil and BusyBox that get
346 fetched in the build step. To get the latest-and-greatest of everything,
347 you could say:
348
@@ -383,11 +383,11 @@
383 rather than let it default to the generic “`trunk`” tag: so the URL will
384 change each time you update your Fossil source tree, forcing Docker to
385 pull a fresh tarball.
386
387
388 ### 5.2 <a id="uids"></a>User & Group IDs
389
390 The “`fossil`” user and group IDs inside the container default to 499.
391 Why? Regular user IDs start at 500 or 1000 on most Unix type systems,
392 leaving those below it for system users like this Fossil daemon owner.
393 Since it’s typical for these to start at 0 and go upward, we started at
@@ -405,11 +405,11 @@
405 file permissions. You may therefore wish them to mean something on both
406 sides of the container barrier rather than have “499” appear on the host
407 in “`ls -l`” output.
408
409
410 ## 6. <a id="light"></a>Lightweight Alternatives to Docker
411
412 Those afflicted with sticker shock at seeing the size of a [Docker
413 Desktop][DD] installation — 1.65 GB here — might’ve immediately
414 “noped” out of the whole concept of containers. The first thing to
415 realize is that when it comes to actually serving simple containers like
@@ -445,11 +445,11 @@
445 [DD]: https://www.docker.com/products/docker-desktop/
446 [DE]: https://docs.docker.com/engine/
447 [DNT]: ./server/debian/nginx.md
448
449
450 ### 6.1 <a id="runc" name="containerd"></a>Stripping Docker Engine Down
451
452 The core of Docker Engine is its [`containerd`][ctrd] daemon and the
453 [`runc`][runc] container runner. It’s possible to dig into the subtree
454 managed by `containerd` on the build host and extract what we need to
455 run our Fossil container elsewhere with `runc`, leaving out all the
@@ -652,11 +652,11 @@
652 [jq]: https://stedolan.github.io/jq/
653 [sdnsp]: #nspawn
654 [runc]: https://github.com/opencontainers/runc
655
656
657 ### 6.2 <a id="podman"></a>Podman
658
659 Although your humble author claims the `runc` methods above are not
660 complicated, merely cryptic, you might be fondly recollecting the
661 carefree commands at the top of this document, pondering whether you can
662 live without the abstractions a proper container runtime system
@@ -697,11 +697,11 @@
697 [pmwin]: https://github.com/containers/podman/blob/main/docs/tutorials/podman-for-windows.md
698 [Podman]: https://podman.io/
699 [whatis]: https://podman.io/whatis.html
700
701
702 #### 6.2.1 <a id="podman-rootless"></a>Fossil in a Rootless Podman Container
703
704 If you build the stock Fossil container under `podman`, it will fail at
705 two key steps:
706
707 1. The `mknod` calls in the second stage, which create the `/jail/dev`
@@ -742,11 +742,11 @@
742 they’ll be connected to the network the container runs on. Once the bad
743 guy is inside the house, he doesn’t necessarily have to go after the
744 residents directly to cause problems for them.
745
746
747 #### 6.2.2 <a id="crun"></a>`crun`
748
749 In the same way that [Docker Engine is based on `runc`](#runc), Podman’s
750 engine is based on [`crun`][crun], a lighter-weight alternative to
751 `runc`. It’s only 1.4 MiB on the system I tested it on, yet it will run
752 the same container bundles as in my `runc` examples above.
@@ -762,11 +762,11 @@
762 `sudo crun`, following the examples above.
763
764 [crun]: https://github.com/containers/crun
765
766
767 #### 6.2.3 <a id="podman-rootful"></a>Fossil in a Rootful Podman Container
768
769 ##### Simple Method
770
771 As we saw above with `runc`, switching to `crun` just to get your
772 containers to run as root loses a lot of functionality and requires a
@@ -831,12 +831,12 @@
831 remote system. You still have to build as root on the local system, but
832 as I said above, Docker already does this. What we’re doing is shifting
833 the risk of running as root from the public host to the local one.
834
835 Once you have the image built on the local machine, create a “`fossil`”
836 repository on your container repository of choice such as [Docker
837 Hub](https://hub.docker.com), then say:
838
839 ```
840 $ docker login
841 $ docker tag fossil:latest mydockername/fossil:latest
842 $ docker image push mydockername/fossil:latest
@@ -857,11 +857,11 @@
857 container images across the Internet, it can be a net win in terms of
858 build time.
859
860
861
862 ### 6.3 <a id="nspawn"></a>`systemd-nspawn`
863
864 As of `systemd` version 242, its optional `nspawn` piece
865 [reportedly](https://www.phoronix.com/news/Systemd-Nspawn-OCI-Runtime)
866 now has the ability to run OCI container bundles directly. You might
867 have it installed already, but if not, it’s only about 2 MiB. It’s
868

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button