|
há 3 anos atrás | |
---|---|---|
conf | há 3 anos atrás | |
doc | há 3 anos atrás | |
layout | há 3 anos atrás | |
mk | há 3 anos atrás | |
.gitignore | há 3 anos atrás | |
AUTHORS.md | há 3 anos atrás | |
CHANGELOG.md | há 3 anos atrás | |
CONTRIBUTING | há 3 anos atrás | |
COPYING | há 3 anos atrás | |
DCO | há 3 anos atrás | |
Makefile | há 3 anos atrás | |
README.md | há 3 anos atrás |
Table of Contents
s6-overlay is an easy-to-install (just extract a tarball or two!) set of scripts and utilities allowing you to use existing Docker images while using s6 as a pid 1 for your container and process supervisor for your services.
Build the following Dockerfile and try it out:
# Use your favorite image
FROM ubuntu
RUN apt-get update && apt-get install -y nginx xz-utils
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
CMD ["/usr/sbin/nginx"]
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-noarch-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch-3.0.0.0.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-x86_64-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64-3.0.0.0.tar.xz
ENTRYPOINT ["/init"]
docker-host $ docker build -t demo .
docker-host $ docker run --name s6demo -d -p 80:80 demo
docker-host $ docker top s6demo acxf
PID TTY STAT TIME COMMAND
11735 ? Ss 0:00 \_ s6-svscan
11772 ? S 0:00 \_ s6-supervise
11773 ? Ss 0:00 | \_ s6-linux-init-s
11771 ? Ss 0:00 \_ rc.init
11812 ? S 0:00 | \_ nginx
11814 ? S 0:00 | \_ nginx
11816 ? S 0:00 | \_ nginx
11813 ? S 0:00 | \_ nginx
11815 ? S 0:00 | \_ nginx
11779 ? S 0:00 \_ s6-supervise
11785 ? Ss 0:00 | \_ s6-ipcserverd
11778 ? S 0:00 \_ s6-supervise
docker-host $ curl --head http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 17 Jan 2022 13:33:58 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 17 Jan 2022 13:32:11 GMT
Connection: keep-alive
ETag: "61e56fdb-264"
Accept-Ranges: bytes
The project has the following goals:
cont-init.d
),
finalization (cont-finish.d
) and their own services with dependencies between themPID 1
functionality
s6
and s6-portable-utils
. They include handy and composable utilities which make our lives much, much easier.logutil-service
which uses s6-log
under the hood.USER
directive, to run your whole process tree as a specific user. Not compatible with all features, details in the notes section.One of the oft-repeated Docker mantras is "one process per container", but we disagree. There's nothing inherently bad about running multiple processes in a container. The more abstract "one thing per container" is our policy - a container should do one thing, such as "run a chat service" or "run gitlab." This may involve multiple processes, which is fine.
The other reason image authors shy away from process supervisors is they believe a process supervisor must restart failed services, meaning the Docker container will never die.
This does effectively break the Docker ecosystem - most images run one process that will exit when there's an error. By exiting on error, you allow the system administrator to handle failures however they prefer. If your image will never exit, you now need some alternative method of error recovery and failure notification.
Our policy is that if "the thing" fails, then the container should fail, too.
We do this by determining which processes can restart, and which should bring down
the container. For example, if cron
or syslog
fails, your container can most
likely restart it without any ill effects, but if ejabberd
fails, the container
should exit so the system administrator can take action.
Our interpretation of "The Docker Way" is thus:
and our init system is designed to do exactly that. Your images will behave like other Docker images and fit in with the existing ecosystem of images.
See "Writing an optional finish script" under the Usage section for details on stopping "the thing."
Our overlay init is a properly customized one to run appropriately in containerized environments. This section briefly explains how stages work but if you want to know how a complete init system should work, you can read this article: How to run s6-svscan as process 1
/etc/cont-init.d
./etc/s6-overlay/s6-rc.d
, following dependencies/etc/services.d
) to a temporary directory and have s6 start (and supervise) them./etc/cont-finish.d
.TERM
signal. There should not be any remaining processes anyway.KILL
signal. Then the container exits.s6-overlay comes as a set of tarballs that you can extract onto your image. The tarballs you need are a function of the image you use; most people will need the first two, and the other ones are extras you can use at your convenience.
Note that this documentation may not be quite up-to-date and you may need
to replace 3.0.0.0
with the latest version of s6-overlay. :-)
s6-overlay-noarch-3.0.0.0.tar.xz
: this tarball contains the scripts
implementing the overlay. We call it "noarch" because it is architecture-
independent: it only contains scripts and other text files. Everyone who
wants to run s6-overlay needs to extract this tarball.s6-overlay-x86_64-3.0.0.0.tar.xz
: replace x86_64
with your
system's architecture. This tarball contains all the necessary binaries
from the s6 ecosystem, all linked statically and out of the way of
your image's binaries. Unless you know for sure that your image already
comes with all the packages providing the binaries used in the overlay,
you need to extract this tarball.s6-overlay-symlinks-noarch-3.0.0.0.tar.xz
: this tarball contains
symlinks to the s6-overlay scripts so they are accessible via /usr/bin
.
It is normally not needed, all the scripts are accessible via the PATH
environment variable, but if you have old user scripts containing
shebangs such as #!/usr/bin/with-contenv
, installing these symlinks
will make them work.s6-overlay-symlinks-arch-3.0.0.0.tar.xz
: this tarball contains
symlinks to the binaries from the s6 ecosystem provided by the second
tarball, to make them accessible via /usr/bin
. It is normally not
needed, but if you have old user scripts containing shebangs such as
#!/usr/bin/execlineb
, installing these symlinks will make them work.syslogd-overlay-noarch-3.0.0.0.tar.xz
: this tarball contains
definitions for a syslogd
service. If you are running daemons that
cannot log to stderr to take advantage of the s6 logging infrastructure,
but hardcode the use of the old syslog()
mechanism, you can extract
this tarball, and your container will run a lightweight emulation of a
syslogd
daemon, so your syslog logs will be caught and stored to disk.To install those tarballs, add lines to your Dockerfile that correspond to the functionality you want to install. For instance, most people would use the following:
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-noarch-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch-3.0.0.0.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-x86_64-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64-3.0.0.0.tar.xz
The project is distributed as a set of standard .tar.xz files, which you extract at the root of your image.
Afterwards, set your ENTRYPOINT
to /init
.
Right now, we recommend using Docker's ADD
directive instead of running wget
or curl
in a RUN
directive - Docker is able to handle the https URL when you use ADD
, whereas
your base image might not be able to use https, or might not even have wget
or curl
installed at all.
From there, you have a couple of options:
CMD
.CMD
Using CMD
is a convenient way to take advantage of the overlay. Your CMD
can be given at
build time in the Dockerfile, or at run time on the command line, either way is fine. It will
be run as a normal process in the environment set up by s6; when it fails or exits, the
container will shut down cleanly and exit. You can run interactive programs in this manner:
only the CMD will receive your interactive command, the support processes will be unimpacted.
For example:
FROM busybox
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-noarch-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch-3.0.0.0.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v3.0.0.0/s6-overlay-x86_64-3.0.0.0.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64-3.0.0.0.tar.xz
ENTRYPOINT ["/init"]
docker-host $ docker build -t s6demo .
docker-host $ docker run -ti s6demo /bin/sh
/package/admin/s6-overlay/libexec/preinit: notice: /var/run is not a symlink to /run, fixing it
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
/ # ps
PID USER TIME COMMAND
1 root 0:00 /package/admin/s6/command/s6-svscan -d4 -- /run/service
17 root 0:00 {rc.init} /bin/sh -e /run/s6/basedir/scripts/rc.init top /bin/sh
18 root 0:00 s6-supervise s6-linux-init-shutdownd
20 root 0:00 /package/admin/s6-linux-init/command/s6-linux-init-shutdownd -c /run/s6/basedir -g 3000 -C -B
24 root 0:00 s6-supervise s6rc-fdholder
25 root 0:00 s6-supervise s6rc-oneshot-runner
31 root 0:00 /package/admin/s6/command/s6-ipcserverd -1 -- /package/admin/s6/command/s6-ipcserver-access -v0 -E -l0 -i data/rules -- /packa
58 root 0:00 /bin/sh
66 root 0:00 ps
/ # exit
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
docker-host $
The other way to use a container with s6-overlay is to make your
services supervised. You can supervise any number of services;
usually they're just support services for the main daemon you run as
a CMD, but if that's what you want, nothing prevents you from having
an empty CMD and running your main daemon as a supervised service as
well. In that case, the daemon will be restarted by s6 whenever it
exits; the container will only stop when you tell it to do so, either
via a docker stop
command, or from inside the container with the
/run/s6/basedir/bin/halt
command.
There are two ways of making a supervised service. The old way, which
is still supported, is to make a "pure s6" service directory. Create a
directory with the name of your service in /etc/services.d
and put an executable run
file into it; this is the file in which you'll put your long-lived process execution.
For details of supervision of service directories, and how you can
configure how s6 handles your daemon, you can take a look at the
servicedir documentation.
A simple example would look like this:
/etc/services.d/myapp/run
:
#!/command/execlineb -P
nginx -g "daemon off;"
The new way is to make an s6-rc
source definition directory in the /etc/s6-overlay/s6-rc.d
directory,
and add the name of that directory to the user
bundle, i.e. create an
empty file with the same name in the /etc/s6-overlay/s6-rc.d/user/contents.d
directory. The format of a source definition directory is described in
this page. Note that
you can define longruns, i.e. daemons that will get supervised by s6 just
like with the /etc/services.d
method, but also oneshots, i.e. programs that
will run once and exit. Your main service is probably a longrun, not a
oneshot: you probably need a daemon to stick around.
The advantage of this new format is that it allows you to define dependencies between services: if B depends on A, then A will start first, then B will start when A is ready, and when the container is told to exit, B will stop first, then A. If you have a complex architecture where various processes depends on one another, or simply where you have to mix oneshots and longruns in a precise order, this may be for you.
The example above could be rewritten this way:
/etc/s6-overlay/s6-rc.d/myapp/type
:
longrun
/etc/s6-overlay/s6-rc.d/myapp/run
:
#!/command/execlineb -P
nginx -g "daemon off;"
/etc/s6-overlay/s6-rc.d/user/contents.d/myapp
: empty file
We encourage you to switch to the new format, but if you don't need its
benefits, you can stick with regular service directories in /etc/services.d
,
it will work just as well.
This section describes a functionality from the versions of s6-overlay that are anterior to 3.0.0.0. fix-attrs is still supported in 3.0.0.0, but is deprecated, for several reasons: one of them is that it's generally not good policy to change ownership dynamically when it can be done statically. Another reason is that it doesn't work with USER containers. Instead of fix-attrs, we now recommend you to take care of ownership and permissions on host mounts offline, before running the container. This should be done in your Dockerfile, when you have all the needed information.
That said, here is what we wrote for previous versions and that is still applicable today (but please stop depending on it):
Sometimes it's interesting to fix ownership & permissions before proceeding because,
for example, you have mounted/mapped a host folder inside your container. Our overlay
provides a way to tackle this issue using files in /etc/fix-attrs.d
.
This is the pattern format followed by fix-attrs files:
path recurse account fmode dmode
path
: File or dir path.recurse
: (Set to true
or false
) If a folder is found, recurse through all containing files & folders in it.account
: Target account. It's possible to default to fallback uid:gid
if the account isn't found. For example, nobody,32768:32768
would try to use the nobody
account first, then fallback to uid 32768
instead.
If, for instance, daemon
account is UID=2
and GID=2
, these are the possible values for account
field:
daemon: UID=2 GID=2
daemon,3:4: UID=2 GID=2
2:2,3:4: UID=2 GID=2
daemon:11111,3:4: UID=2 GID=11111
11111:daemon,3:4: UID=11111 GID=2
daemon:daemon,3:4: UID=2 GID=2
daemon:unexisting,3:4: UID=2 GID=4
unexisting:daemon,3:4: UID=3 GID=2
11111:11111,3:4: UID=11111 GID=11111
fmode
: Target file mode. For example, 0644
.dmode
: Target dir/folder mode. For example, 0755
.Here you have some working examples:
/etc/fix-attrs.d/01-mysql-data-dir
:
/var/lib/mysql true mysql 0600 0700
/etc/fix-attrs.d/02-mysql-log-dirs
:
/var/log/mysql-error-logs true nobody,32768:32768 0644 2700
/var/log/mysql-general-logs true nobody,32768:32768 0644 2700
/var/log/mysql-slow-query-logs true nobody,32768:32768 0644 2700
Here is the old way of doing it:
After fixing attributes (through /etc/fix-attrs.d/
) and before starting
user provided services (through s6-rc or /etc/services.d
) our overlay will
execute all the scripts found in /etc/cont-init.d
, for example:
/etc/cont-init.d/02-confd-onetime
:
#!/command/execlineb -P
with-contenv
s6-envuidgid nginx
multisubstitute
{
import -u -D0 UID
import -u -D0 GID
import -u CONFD_PREFIX
define CONFD_CHECK_CMD "/usr/sbin/nginx -t -c {{ .src }}"
}
confd --onetime --prefix="${CONFD_PREFIX}" --tmpl-uid="${UID}" --tmpl-gid="${GID}" --tmpl-src="/etc/nginx/nginx.conf.tmpl" --tmpl-dest="/etc/nginx/nginx.conf" --tmpl-check-cmd="${CONFD_CHECK_CMD}" etcd
This way is still supported. However, there is now a more generic and
efficient way to do it: writing your oneshot initialization and finalization
tasks as s6-rc services, by adding service definition directories in
/etc/s6-overlay/s6-rc.d
and making them part of the user
bundle. All
the information on s6-rc can be found here.
When the container is started, the operations are performed in this order:
/etc/fix-attrs.d
./etc/cont-init.d
are run sequentially.user
bundle are started by s6-rc, in an order defined by
dependencies. Services can be oneshots (initialization
tasks) or longruns (daemons that will run throughout the container's lifetime)./etc/services.d
are started.When the container is stopped, either because the admin sent a stop command or because the CMD exited, the operations are performed in the reverse order:
/etc/services.d
are stopped.down
script in the source definition directory
is executed; that's how s6-rc can perform finalization tasks./etc/cont-finish.d
are run sequentially.By default, services created in /etc/services.d
will automatically restart.
If a service should bring the container down, you should probably run it as
a CMD instead; but if you'd rather run it as a supervised service, then you'll
need to write a finish
script, which will be run when the service is down; to
make the container stop, the /run/s6/basedir/bin/halt
command must be invoked.
Here's an example finish script:
/etc/services.d/myapp/finish
:
#!/command/execlineb -S0
foreground { redirfd -w 1 /run/s6-linux-init-container-results/exitcode echo 0 }
/run/s6/basedir/bin/halt
The first line of the script writes 0
to the /run/s6-linux-init-container-results/exitcode
file.
The second line stops the container. When you stop the container via the /run/s6/basedir/bin/halt
command run from inside the container, /run/s6-linux-init-container-results/exitcode
is read and
its contents are used as the exit code for the docker run
command that launched the container.
If the file doesn't exist, or if the container is stopped with docker stop
or another reason,
that exit code defaults to 0.
It is possible to do more advanced operations in a finish script. For example, here's a script from that only brings down the service when it exits nonzero:
/etc/services.d/myapp/finish
:
#!/command/execlineb -S1
if { s6-test ${1} -ne 0 -a ${1} -ne 256 }
/run/s6/basedir/bin/halt
Note that in general, finish scripts should only be used for local cleanups after a daemon dies. If a service is so important that the container needs to stop when it dies, we really recommend runnning it as the CMD.
Every service can have its dedicated logger. A logger is a s6 service that
automatically reads from the stdout of your service, and logs the data
to an automatically rotated file in the place you want. Note that daemons
usually log to stderr, not stdout, so you should probably start your service's
run script with exec 2>&1
in shell, or with fdmove -c 2 1
in execline, in
order to catch stderr.
s6-overlay provides a utility called logutil-service
which is a wrapper over
the s6-log
program.
This helper does the following:
S6_LOGGING_SCRIPT
nobody
user (defaulting to 65534:65534
if it doesn't exist)s6-log will then run forever, reading data from your service and writing it to
the directory you specified to logutil-service
.
Please note:
s6-setuidgid
nobody
usernobody
user.You can create log folders in cont-init.d
scripts, or as s6-rc oneshots.
Here is an example of a logged service myapp
implemented the old way:
/etc/cont-init.d/myapp-log-prepare
:
#!/bin/sh -e
mkdir -p /var/log/myapp
chown nobody:nogroup /var/log/myapp
chmod 02755 /var/log/myapp
/etc/services.d/myapp/run
:
#!/bin/sh
exec 2>&1
exec mydaemon-in-the-foreground-and-logging-to-stderr
/etc/services.d/myapp/log/run
:
#!/bin/sh
exec logutil-service /var/log/myapp
And here is the same service, myapp, implemented in s6-rc.
/etc/s6-overlay/s6-rc.d/myapp-log-prepare/type
:
oneshot
/etc/s6-overlay/s6-rc.d/myapp-log-prepare/up
:
if { mkdir -p /var/log/myapp }
if { chown nobody:nogroup /var/log/myapp }
chmod 02755 /var/log/myapp
/etc/s6-overlay/s6-rc.d/myapp/type
:
longrun
/etc/s6-overlay/s6-rc.d/myapp/run
:
#!/bin/sh
exec 2>&1
exec mydaemon-in-the-foreground-and-logging-to-stderr
/etc/s6-overlay/s6-rc.d/myapp/producer-for
:
myapp-log
/etc/s6-overlay/s6-rc.d/myapp-log/type
:
oneshot
/etc/s6-overlay/s6-rc.d/myapp-log/run
:
#!/bin/sh
exec logutil-service /var/log/myapp
/etc/s6-overlay/s6-rc.d/myapp-log/consumer-for
:
myapp
/etc/s6-overlay/s6-rc.d/myapp-log/dependencies
:
myapp-log-prepare
/etc/s6-overlay/s6-rc.d/myapp-log/pipeline-name
:
myapp-pipeline
/etc/s6-overlay/s6-rc.d/user/contents.d/myapp-pipeline
: empty file
That's a lot of files! A summary of what it all means is:
myapp | myapp-log
pipeline is given a name, myapp-pipeline
, and
this name is declared as a part of the user
bundle, so it will be started
when the container starts.It really accomplishes the same things as the /etc/cont-init.d
plus
/etc/services.d
method, but it's a lot cleaner underneath, and can handle
much more complex dependency graphs, so whenever you get the opportunity,
we recommend you familiarize yourself with the s6-rc
way of declaring your services and your loggers.
When it comes to executing a service, no matter whether it's a service or a logger,
a good practice is to drop privileges before executing it.
s6
already includes utilities to do exactly these kind of things:
In execline
:
#!/command/execlineb -P
s6-setuidgid daemon
myservice
In sh
:
#!/bin/sh
exec s6-setuidgid daemon myservice
If you want to know more about these utilities, please take a look at:
s6-setuidgid
,
s6-envuidgid
, and
s6-applyuidgid
.
If you want your custom script to have container environments available:
you can use the with-contenv
helper, which will push all of those into your
execution environment, for example:
/etc/cont-init.d/01-contenv-example
:
#!/usr/bin/with-contenv sh
env
This script will output the contents of your container environment.
Recent versions of Docker allow running containers with a read-only root filesystem.
If your container is in such a case, you should set S6_READ_ONLY_ROOT=1
to inform
s6-overlay that it should not attempt to write to certain areas - instead, it will
perform copies into a tmpfs mounted on /run
.
Note that s6-overlay assumes that:
/run
exists and is writable. If it is not, it will attempt to mount a tmpfs there./var/run
is a symbolic link to /run
, for compatibility with previous versions. If it is not, it will make it so.In general your default docker settings should already provide a suitable tmpfs in /run
.
s6
behaviourIt is possible somehow to tweak s6
behaviour by providing an already predefined set of environment variables to the execution context:
S6_KEEP_ENV
(default = 0): if set, then environment is not reset and whole supervision tree sees original set of env vars. It switches with-contenv
into noop.S6_LOGGING
(default = 0):
0
: Outputs everything to stdout/stderr.1
: Uses an internal catch-all
logger and persists everything on it, it is located in /var/log/s6-uncaught-logs
. Anything run as a CMD
is still output to stdout/stderr.2
: Uses an internal catch-all
logger and persists everything on it, including the output of CMD
. Absolutely nothing is written to stdout/stderr.S6_CATCHALL_USER
(default = root): if set, and if S6_LOGGING
is 1 or 2,
then the catch-all logger is run as this user, which must be defined in your
image's /etc/passwd
. Every bit of privilege separation helps a little with security.S6_BEHAVIOUR_IF_STAGE2_FAILS
(default = 0):
0
: Continue silently even if any script (fix-attrs
or cont-init
) has failed.1
: Continue but warn with an annoying error message.2
: Stop by sending a termination signal to the supervision tree.S6_KILL_FINISH_MAXTIME
(default = 5000): The maximum time (in milliseconds) a script in /etc/cont-finish.d
could take before sending a KILL
signal to it. Take into account that this parameter will be used per each script execution, it's not a max time for the whole set of scripts.S6_SERVICES_GRACETIME
(default = 3000): How long (in milliseconds) s6
should wait services before sending a TERM
signal.S6_KILL_GRACETIME
(default = 3000): How long (in milliseconds) s6
should wait to reap zombies before sending a KILL
signal.S6_LOGGING_SCRIPT
(default = "n20 s1000000 T"): This env decides what to log and how, by default every line will prepend with ISO8601, rotated when the current logging file reaches 1mb and archived, at most, with 20 files.S6_CMD_ARG0
(default = not set): Value of this env var will be prepended to any CMD
args passed by docker. Use it if you are migrting an existing image to a s6-overlay and want to make it a drop-in replacement, then setting this variable to a value of previously used ENTRYPOINT will improve compatibility with the way image is used.S6_FIX_ATTRS_HIDDEN
(default = 0): Controls how fix-attrs.d
scripts process files and directories.
0
: Hidden files and directories are excluded.1
: All files and directories are processed.S6_CMD_WAIT_FOR_SERVICES
(default = 0): In order to proceed executing CMD overlay will wait until services are up. Be aware that up doesn't mean ready. Depending if notification-fd
was found inside the servicedir overlay will use s6-svwait -U
or s6-svwait -u
as the waiting statement.S6_CMD_WAIT_FOR_SERVICES_MAXTIME
(default = 5000): The maximum time (in milliseconds) the services could take to bring up before proceding to CMD executing.S6_READ_ONLY_ROOT
(default = 0): When running in a container whose root filesystem is read-only, set this env to 1 to inform init stage 2 that it should copy user-provided initialization scripts from /etc
to /var/run/s6/etc
before it attempts to change permissions, etc. See Read-Only Root Filesystem for more information.S6_SYNC_DISKS
(default = 0): Set this env to 1 to inform init stage 3 that it should attempt to sync filesystems before stopping the container. Note: this will likely sync all filesystems on the host.If software running in your container requires syslog, extract the
syslogd-overlay-noarch-3.0.0.0.tar.xz
tarball:
that will give you a small syslogd emulation. Logs will be found
under various subdirectories of /var/log/syslogd
, for instance
messages will be found in the /var/log/syslogd/messages/
directory,
the latest logs being available in the /var/log/syslogd/messages/current
file.
Logging directories are used rather than files so that logs can be
automatically rotated without race conditions (that is a feature of
s6-log).
It is recommended to add syslog
and sysllog
users to your image, for
privilege separation; the syslogd emulation processes will run as these users
if they exist. Otherwise they will default to 32760:32760
and 32761:32761
,
numeric uids/gids that may already exist on your system.
docker run
, but you will notice it's fast. Faster than previous
versions of s6-overlay, with fewer delays. And if you convert your /etc/cont-init.d
scripts to the s6-rc format, they will be able to run in parallel, so you will
gain even more performance. If you have benchmarks, please send them to us!The s6-overlay releases are not yet signed; we will get to it really soon. You can import our gpg public key:
$ curl https://keybase.io/justcontainers/key.asc | gpg --import
When we've signed the releases, you can then verify the downloaded files:
$ gpg --verify s6-overlay-x86_64-3.0.0.0.tar.xz.sig s6-overlay-x86_64-3.0.0.0.tar.xz
gpg: Signature made Sun 22 Nov 2015 09:11:29 AM CST using RSA key ID BD7BF0DC
gpg: Good signature from "Just Containers <[email protected]>"
USER
directiveAs of version 3.0.0.0, s6-overlay has limited support for running as a user other than root
:
fix-attrs
and logutil-service
are unlikely to work (they rely
on being able to change UIDs).Generally speaking, if you're running a simple container with a main application and
one or two support services, you may benefit from the USER
directive if that is
your preferred way of running containers. However, if you're running more than a few
services, or daemons that expect a real system with complete Unix infrastructure,
then USER is probably not a good idea and you would benefit more from using
privilege separation between services in your container.
Over on the releases tab, we have a number of tarballs:
s6-overlay-noarch-${version}.tar.xz
: the s6-overlay scripts.s6-overlay-${arch}-${version}.tar.xz
: the binaries for platform ${arch}.
They are statically compiled and will work with any Linux distribution.s6-overlay-symlinks-noarch-${version}.tar.xz
: /usr/bin
symlinks to the s6-overlay scripts. Totally optional.s6-overlay-symlinks-arch-${version}.tar.xz
: /usr/bin
symlinks to the skaware binaries. Totally optional.syslogd-overlay-noarch-${version}.tar.xz
: the syslogd emulation. Totally optional.s6-overlay-${version}.tar.xz
: the s6-overlay source. Download it if you want to build s6-overlay yourself.We have binaries for at least x86_64, aarch64, arm32, i486, i686, and riscv64. The full list of supported arches can be found in conf/toolchains.
Anyway you want! Open issues, open PRs, we welcome all contributors!
make
followed by your variable assignments. Example: make ARCH=riscv64-linux-musl
to build the overlay for RISCV64.output
subdirectory, unless you changed the OUTPUT
variable.Please see CHANGELOG.