|
|
@@ -0,0 +1,135 @@ |
|
|
|
# Focker Basic Usage Guide
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
In order to get started, you have to prepare a base image for usage with Focker.
|
|
|
|
In order to do so, you can use the `focker bootstrap` command.
|
|
|
|
|
|
|
|
`focker bootstrap` has the following syntax:
|
|
|
|
|
|
|
|
```
|
|
|
|
usage: focker.py bootstrap [-h] [--tags TAGS [TAGS ...]] [--empty]
|
|
|
|
|
|
|
|
optional arguments:
|
|
|
|
-h, --help show this help message and exit
|
|
|
|
--tags TAGS [TAGS ...], -t TAGS [TAGS ...]
|
|
|
|
--empty, -e
|
|
|
|
```
|
|
|
|
|
|
|
|
If you use the `--empty` switch, it will create an empty image. This is used
|
|
|
|
principally for testing and unless you want to set up your image manually, it is
|
|
|
|
recommended to run `bootstrap` without the `--empty` switch.
|
|
|
|
|
|
|
|
The `--tags` parameter lets you specify the tags that the resulting image will
|
|
|
|
receive. If you do not specify this, the image will be tagged with `freebsd-latest`
|
|
|
|
and `freebsd-x.y` where `x.y` will be the major and minor version obtained
|
|
|
|
from a call to `freebsd-version`.
|
|
|
|
|
|
|
|
The `bootstrap` command creates a new image and runs `bsdinstall jail` targeting
|
|
|
|
its mountpoint. It is recommended to install only the base system (no ports, no lib32),
|
|
|
|
disable all services and do not add any users. The base image will most likely serve as
|
|
|
|
the starting point for all the other images that you will be building. Pre-made
|
|
|
|
`Fockerfile` recipes, unless indicated otherwise, will most likely expect a
|
|
|
|
barebones image as the base.
|
|
|
|
|
|
|
|
It is a good practice to account for a base image that has been created by just
|
|
|
|
clicking through the `bsdinstall jail` installer. Therefore, many `Fockerfile`
|
|
|
|
recipes will execute the following steps to disable sshd, sendmail, make syslog
|
|
|
|
listen only locally, enable clearing of `/tmp` and disable writing to
|
|
|
|
`/var/spool/clientmqueue`:
|
|
|
|
|
|
|
|
```
|
|
|
|
sysrc sshd_enable=NO
|
|
|
|
sysrc sendmail_enable=NONE
|
|
|
|
chown root:wheel /var/spool/clientmqueue
|
|
|
|
chmod 000 /var/spool/clientmqueue
|
|
|
|
sysrc syslogd_flags="-ss"
|
|
|
|
sysrc clear_tmp_enable="YES"
|
|
|
|
```
|
|
|
|
|
|
|
|
We can now move on and let you try create your first own customized `Fockerfile`.
|
|
|
|
|
|
|
|
## Trivial Example
|
|
|
|
|
|
|
|
At the very basic level, Focker can be used simply as a jail building system.
|
|
|
|
In order to get started you have to create a new directory:
|
|
|
|
|
|
|
|
```
|
|
|
|
mkdir test-focker-build
|
|
|
|
cd test-focker-build/
|
|
|
|
```
|
|
|
|
|
|
|
|
with a file called `Fockerfile` inside:
|
|
|
|
|
|
|
|
`touch Fockerfile`.
|
|
|
|
|
|
|
|
Using your editor of choice (`ee` is a good one), you can now put a trivial
|
|
|
|
directive in `Fockerfile`:
|
|
|
|
|
|
|
|
```
|
|
|
|
base: freebsd-latest
|
|
|
|
steps: []
|
|
|
|
```
|
|
|
|
|
|
|
|
The `base` directive determines the starting point for your future image.
|
|
|
|
A starting point is simply a pre-existing image. We will call this image
|
|
|
|
the parent image. The chain always terminates with an image that doesn't have
|
|
|
|
a parent. Such an image has to be created manually, by using `focker bootstrap`
|
|
|
|
or perhaps transferred using `zfs send`/`zfs receive` combo.
|
|
|
|
|
|
|
|
Now you are ready to build your first image. Run:
|
|
|
|
|
|
|
|
`focker image build .`
|
|
|
|
|
|
|
|
The `focker image build` command has the following syntax:
|
|
|
|
|
|
|
|
```
|
|
|
|
usage: focker.py image build [-h] [--tags TAGS [TAGS ...]] [--squeeze]
|
|
|
|
focker_dir
|
|
|
|
|
|
|
|
positional arguments:
|
|
|
|
focker_dir
|
|
|
|
|
|
|
|
optional arguments:
|
|
|
|
-h, --help show this help message and exit
|
|
|
|
--tags TAGS [TAGS ...], -t TAGS [TAGS ...]
|
|
|
|
--squeeze, -s
|
|
|
|
```
|
|
|
|
|
|
|
|
As you can see, in our call `focker image build .` we have specified only the
|
|
|
|
`focker_dir` parameter. It tells the Focker which directory contains the
|
|
|
|
Fockerfile and potentially any additional files that you would like to include
|
|
|
|
in your build (we will get to this later).
|
|
|
|
|
|
|
|
You will see an output similar to the following:
|
|
|
|
|
|
|
|
```
|
|
|
|
Waiting for /var/lock/focker.lock ...
|
|
|
|
Lock acquired.
|
|
|
|
poolname: zroot
|
|
|
|
fname: ./Fockerfile
|
|
|
|
spec: {'base': 'freebsd-latest', 'steps': []}
|
|
|
|
base: zroot/focker/images/e4d5685@1 root: zroot/focker/images
|
|
|
|
```
|
|
|
|
|
|
|
|
and if you run `focker image list` you will discover that you are still
|
|
|
|
stuck only with your pre-existing base image. Why is that?
|
|
|
|
|
|
|
|
Since we have specified no `steps` or more precisely we have specified
|
|
|
|
an empty list of steps, the resulting image has the same checksum as the
|
|
|
|
base image. This is the case since no modifications have been made and the
|
|
|
|
image content is identical. To observe an effect, we could still run:
|
|
|
|
|
|
|
|
`focker image build . -t test-build`
|
|
|
|
|
|
|
|
This will instruct Focker to add a new tag to the resulting image. If you
|
|
|
|
run `focker image list` now, you should see an output similar to:
|
|
|
|
|
|
|
|
```
|
|
|
|
Tags Size SHA256 Base
|
|
|
|
-------------------------------------- ------ -------- -------
|
|
|
|
freebsd-latest freebsd-11.2 test-build 266M e4d5685 -
|
|
|
|
```
|
|
|
|
|
|
|
|
Congratulations! Your first image has been tagged. We can now start
|
|
|
|
filling the `steps` list to create something more useful.
|