From 156e048419fde391c67258a15fe0fe76bdee54a1 Mon Sep 17 00:00:00 2001 From: Samir Akarioh Date: Mon, 17 Jul 2023 11:28:52 +0200 Subject: [PATCH 01/17] docs: Rewrite the explanation section This PR add the explanation of Pebble and rewrite chisel,rocks and overlay-step explanation. Co-authored-by: Cristovao Cordeiro --- docs/.wordlist.txt | 67 +++-------------------------- docs/_static/rockcraft_diagram.jpg | Bin 0 -> 12969 bytes docs/explanation/chisel.rst | 10 +++++ docs/explanation/index.rst | 1 + docs/explanation/overlay-step.rst | 4 +- docs/explanation/pebble.rst | 36 ++++++++++++++++ docs/explanation/rocks.rst | 63 +++++++++++++++++++++------ 7 files changed, 108 insertions(+), 73 deletions(-) create mode 100644 docs/_static/rockcraft_diagram.jpg create mode 100644 docs/explanation/pebble.rst diff --git a/docs/.wordlist.txt b/docs/.wordlist.txt index c3abf626a..7ca54471f 100644 --- a/docs/.wordlist.txt +++ b/docs/.wordlist.txt @@ -1,11 +1,16 @@ +ACR Charmcraft cli CLI +CMD dev Diátaxis Dockerfile Dockerfiles +DockerHub +ECR entrypoint +entrypoints filesystem fs GID @@ -23,6 +28,7 @@ Lifecycle linuxcontainers literalinclude localhost +LTS lxd LXD Multipass @@ -36,66 +42,7 @@ OpenSSL OpenSSL's packageName Permalink -pyfiglet -PyPI -reStructuredText -rockcraft -Rockcraft -Rockcraft's -ROCK's -ROCKs -Runtime -skopeo -Skopeo -sliceName -snapcraft -Snapcraft -Snyk's -SPDX -SSL -ubuntu -UID -yaml -Znet -samir@samir-Laptop:~/Desktop/Github-Repo/rockcraft/docs$ sort .wordlist.txt -Charmcraft -cli -CLI -dev -Diátaxis -Dockerfile -Dockerfiles -entrypoint -filesystem -fs -GID -github -GPG -https -init -interoperable -io -Kubernetes -libc -libssl -lifecycle -Lifecycle -linuxcontainers -literalinclude -localhost -lxd -LXD -Multipass -nginx -NGINX -NGINX's -oci -OCI -openssl -OpenSSL -OpenSSL's -packageName -Permalink +Podman pyfiglet PyPI reStructuredText diff --git a/docs/_static/rockcraft_diagram.jpg b/docs/_static/rockcraft_diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dee36d8bd69b89b3fe30186da0b64cb802a09258 GIT binary patch literal 12969 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 literal 0 HcmV?d00001 diff --git a/docs/explanation/chisel.rst b/docs/explanation/chisel.rst index 4983c151a..91d984c4a 100644 --- a/docs/explanation/chisel.rst +++ b/docs/explanation/chisel.rst @@ -12,6 +12,16 @@ needed for the ROCK to function properly. See :ref:`how_to_use_chisel` for information about using the tool. +Slice definitions +----------------- + +A slice is a yaml file permitting chisel to slice the package, +`here `_ is +the slice definition reference. + +To find more examples or if you want to contribute, +check `chisel-releases `_. + Package slices -------------- diff --git a/docs/explanation/index.rst b/docs/explanation/index.rst index 376af4f2b..3fce6d247 100644 --- a/docs/explanation/index.rst +++ b/docs/explanation/index.rst @@ -14,3 +14,4 @@ the motivations behind its development. chisel overlay-step rocks + pebble diff --git a/docs/explanation/overlay-step.rst b/docs/explanation/overlay-step.rst index 75ed36612..8d5cc9d7c 100644 --- a/docs/explanation/overlay-step.rst +++ b/docs/explanation/overlay-step.rst @@ -5,6 +5,8 @@ The component parts of a ROCK are built in a sequence of five separate steps: pull, overlay, build, stage and prime. The overlay step is specific to ROCKs and is configured with overlay parameters. +To learn more about pull,build,stage and prime see :doc:`/reference/parts` + .. Include a section about overlay parameters from the Craft Parts documentation. -.. .. include:: /common/craft-parts/overlay_parameters.rst +.. include:: /common/craft-parts/overlay_parameters.rst diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst new file mode 100644 index 000000000..c289bc218 --- /dev/null +++ b/docs/explanation/pebble.rst @@ -0,0 +1,36 @@ +.. _pebble_explanation_page: + +Pebble +====== + +Pebble is a service manager that helps to organise a set of local service +processes. + +When creating container images, several issues can be met. +For instance, if the entrypoint relies on the application mode +(such as nginx and nginx-debug), creating a bash script that parses all the +arguments provided during container deployment will be necessary. +Additionally, each image runs with specific application arguments, +making it challenging to perform an inspection inside the image consistently. + +Pebble solves these problems by providing a comprehensive set of commands +for starting, stopping, and viewing service status. It also includes features +like auto-restart for continuous operation and dependency management for +properly sequencing services. Pebble streamlines service management as a +single binary that operates as a background service and a client. + +In ROCKs, Pebble services are defined with properties such as name, command, +startup behaviour, dependencies,... Moreover, Pebble is the default entrypoint +(an executable that runs when the container is initiated) in ROCKs, ensuring +consistent container inspection and permit to have multiple entrypoint +without the need to create other files. + + +Create a service +---------------- + +See :doc:`/how-to/convert-to-pebble-layer` for information about converting +a Docker entrypoint to a pebble service. Also, check the top-level field +on :doc:`/reference/rockcraft.yaml` to understand the parameters and fields +needed to create a service. + diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index 9f7c2c052..5b6f7b95d 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -3,22 +3,61 @@ ROCKs ===== -ROCKs are container images that are compliant with the `Open Container -Initiative`_ (OCI) `image format specification `_. -This means that ROCKs are interoperable with other tools that work with -OCI-compliant images. +ROCKs are Ubuntu-based container images that are designed to meet +cloud-native software's security, stability, and reliability requirements. -A ROCK can be stored in an existing container registry, very much like any -Docker image, and run in the same way as any other container image. -For example, Docker can be used to run a ROCK with the usual command line -syntax: +ROCKs were created with a focus on those values: -.. code:: bash +* **Developers experience**: Rockcraft uses a declarative format to describe ROCKs, + aiming to simplify container image definition and provide the best user experience. +* **Ubuntu Experience**: Built on top of Ubuntu, ROCKs provide reliability + and stability to users. They offer access to the latest features, ensuring + users can meet their needs. With long-term support (LTS), ROCKs images + are regularly updated. +* **Consistency**: ROCKs are consistent by utilising Pebble as the entrypoint. + Learning Pebble allows you to interact smoothly with all the ROCKs. - docker run ... +ROCKs comply with the `Open Container +Initiative`_ (OCI) `image format specification `_. +ROCKs can be stored in container registries (e.g. DockerHub, ECR, ACR,..) +and used with any OCI-Compliant tools (e.g. Docker, Podman, Kubernetes,...). -Interoperability between ROCKs and other containers also extends to the way -that container images are built. This enables the use of ROCKs as bases for +Interoperability between ROCKs and other containers also extends to how +container images are built. This enables using ROCKs as bases for existing build recipes, such as Dockerfiles, for further customisation and development. +The ROCKs ecosystem comprises + +.. figure:: /_static/rockcraft_diagram.jpg + :width: 75% + :align: center + :alt: ROCKs ecosystem + + +Chisel +------ + +Chisel is a software tool for extracting well-defined portions +(also known as slices) of Debian packages into a filesystem. +To learn more about Chisel see: :ref:`chisel_explanation` + +Pebble +------ + +In ROCKS, Pebble is the default entrypoint (an executable that +runs when the container is initiated) in ROCKS, ensuring consistent +container inspection and permit to have multiple entrypoint +without the need to create other files.To learn more about +Pebble see: :ref:`pebble_explanation_page` + +Rockcraft +--------- + +Rockcraft is a tool designed to build ROCKs using a declarative syntax +(yaml). It leverages the logic of plugins, parts,and concepts that exist +in Snapcraft and Charmcraft. + +Developers familiar with the creation and publication of snaps and charms +will be able to utilise existing knowledge to create ROCKS. +To learn why you need to use Rockcraft see: :ref:`why_use_rockcraft` From dfcf97c15b08617485bace71c9eba48803170964 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Fri, 28 Jul 2023 12:19:03 +0200 Subject: [PATCH 02/17] docs: update submodule sphinx-starter-pack --- docs/sphinx-starter-pack | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx-starter-pack b/docs/sphinx-starter-pack index 64bcf4b34..d3f01a4eb 160000 --- a/docs/sphinx-starter-pack +++ b/docs/sphinx-starter-pack @@ -1 +1 @@ -Subproject commit 64bcf4b3491d453882aeb339badc2b6774ad1119 +Subproject commit d3f01a4eb1d47a05a84517d0e94b173ee78ba997 From 9df48c6902a3d3ad92178caac09197402c68f346 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Fri, 28 Jul 2023 12:41:31 +0200 Subject: [PATCH 03/17] docs: fix css styling conflicts --- Makefile | 4 +++- docs/_static/css/custom.css | 25 ------------------------- docs/conf.py | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 5694bec91..1f0795104 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,7 @@ clean: ## Clean artefacts from building, testing, etc. rm -f .coverage rm -rf htmlcov/ rm -rf .pytest_cache + $(MAKE) -C docs clean .PHONY: coverage coverage: ## Run pytest with coverage report. @@ -41,7 +42,8 @@ coverage: ## Run pytest with coverage report. preparedocs: ## move file from the sphinx-starter-pack to docs folder git submodule update --init -- docs/sphinx-starter-pack cp docs/sphinx-starter-pack/.sphinx/_static/* docs/_static - cp -R docs/sphinx-starter-pack/.sphinx/_templates docs/_templates + mkdir docs/_templates || true + cp -R docs/sphinx-starter-pack/.sphinx/_templates/* docs/_templates cp docs/sphinx-starter-pack/.sphinx/spellingcheck.yaml docs/spellingcheck.yaml .PHONY: installdocs diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index ef7e97f64..71cc44b82 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -1,28 +1,3 @@ -@import url('https://fonts.googleapis.com/css2?family=Ubuntu:ital@0;1&display=swap'); - -body { - font-family: Ubuntu, "times new roman", times, roman, serif; -} - -div .toctree-wrapper { - column-count: 2; -} - -div .toctree-wrapper>ul { - margin: 0; -} - -ul .toctree-l1 { - margin: 0; - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid-column; -} - -.wy-nav-content { - max-width: none; -} - .log-snippets { color: rgb(141, 141, 141); } diff --git a/docs/conf.py b/docs/conf.py index c5fa99bda..96ad90059 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -50,6 +50,11 @@ html_favicon = "_static/favicon.png" html_context = { + # Change to the link to your product website (without "https://") + "product_page": "github.com/canonical/rockcraft", + # Add your product tag to ".sphinx/_static" and change the path + # here (start with "_static"), default is the circle of friends + "product_tag": "_static/tag.png", # Change to the discourse instance you want to be able to link to # (use an empty value if you don't want to link) "discourse": "https://discourse.ubuntu.com/c/rocks/117", @@ -191,9 +196,14 @@ # These paths are either relative to html_static_path # or fully qualified paths (eg. https://...) -html_css_files = ["css/custom.css", "github_issue_links.css", "custom.css"] +html_css_files = [ + "css/custom.css", + "github_issue_links.css", + "custom.css", + "header.css", +] -html_js_files = [] +html_js_files = ["header-nav.js"] if "github_issues" in html_context and html_context["github_issues"]: html_js_files.append("github_issue_links.js") From ff2588e19fc27f9c65e3c7afa4a367f095e5993d Mon Sep 17 00:00:00 2001 From: David Boddie Date: Fri, 28 Jul 2023 12:35:55 +0100 Subject: [PATCH 04/17] docs: fix typo --- docs/explanation/pebble.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index c92e0ae86..a1021ed7b 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -33,7 +33,7 @@ Features When creating container images, several issues can be met. For instance, if the entrypoint relies on the application mode (such as nginx and nginx-debug), creating a bash script that parses all the -arguments provided during container deployment will be necessary./ +arguments provided during container deployment will be necessary. Additionally, each image runs with specific application arguments, making it challenging to perform an inspection inside the image consistently. From 127198fae530260fc9aff7bb7db5ae04b5fc888a Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Fri, 28 Jul 2023 19:45:41 +0200 Subject: [PATCH 05/17] docs: re-work Pebble section --- docs/.wordlist.txt | 6 ++ docs/explanation/pebble.rst | 118 ++++++++++++++++++++++-------------- docs/explanation/rocks.rst | 11 ++-- 3 files changed, 83 insertions(+), 52 deletions(-) diff --git a/docs/.wordlist.txt b/docs/.wordlist.txt index 2f572ea7c..c57e3abec 100644 --- a/docs/.wordlist.txt +++ b/docs/.wordlist.txt @@ -7,6 +7,7 @@ CLI cmake CMake CMD +declaratively dev Diátaxis dnf @@ -54,6 +55,7 @@ OpenSSL's organize packageName Permalink +PID Podman pyfiglet PyPI @@ -63,6 +65,7 @@ Rockcraft Rockcraft's ROCK's ROCKs +runit Runtime scons SCons @@ -77,6 +80,9 @@ SSL subdir subdirectory submodules +subreaping +supervisord +tini triaged ubuntu UID diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index c92e0ae86..7da3890e1 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -7,54 +7,78 @@ Pebble **Pebble is the default entrypoint for all ROCKs!** Similar to other well-known process managers such as *supervisord*, *runit*, or -*s6*, Pebble is a service manager that enables the seamless orchestration of a -collection of local service processes as a cohesive unit (i.e. an organized set -of processes). The main difference is that Pebble has been designed with -custom-tailored features that significantly enhance the overall container -experience, making it the ideal candidate for the container's init process -(also known as the entrypoint, with PID=1). +*s6*, `Pebble`_ is a service manager that enables the seamless orchestration of +a collection of local service processes as organised set. The main difference +is that `Pebble`_ has been designed with custom-tailored features that +significantly enhance the overall container experience, making it the ideal +candidate for the container's init process (also known as the entrypoint, +with PID=1). Multiple processes in a container? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Containers' best practices dictate it is better to separate areas of concern -and have one service per container. The introduction of Pebble as the ROCKs' -entrypoint elevates this notion such that: - - if multiple processes have shared dependencies and must always be executed - together, then it is best practice to orchestrate them within the same - container. - - -Features -~~~~~~~~ - - -When creating container images, several issues can be met. -For instance, if the entrypoint relies on the application mode -(such as nginx and nginx-debug), creating a bash script that parses all the -arguments provided during container deployment will be necessary./ -Additionally, each image runs with specific application arguments, -making it challenging to perform an inspection inside the image consistently. - -Pebble solves these problems by providing a comprehensive set of commands -for starting, stopping, and viewing service status. It also includes features -like auto-restart for continuous operation and dependency management for -properly sequencing services. Pebble streamlines service management as a -single binary that operates as a background service and a client. - -In ROCKs, Pebble services are defined with properties such as name, command, -startup behaviour, dependencies,... Moreover, Pebble is the default entrypoint -(an executable that runs when the container is initiated) in ROCKs, ensuring -consistent container inspection and permit to have multiple entrypoint -without the need to create other files. - - -Create a service ----------------- - -See :doc:`/how-to/convert-to-pebble-layer` for information about converting -a Docker entrypoint to a pebble service. Also, check the top-level field -on :doc:`/reference/rockcraft.yaml` to understand the parameters and fields -needed to create a service. - +Containers' best practices advocate the separation of concerns and the adoption +of a single service per container. With the introduction of `Pebble`_ as the +ROCKs' entrypoint, this principle is elevated to new heights: + + if multiple processes rely on shared dependencies and are tightly coupled + together (i.e. they serve a single purpose and cannot be executed + independently), then the best practice entails orchestrating them within the + same container, with `Pebble`_ as their manager. + +This new notion addressed existing pain points arising from the excessive +separation of concerns, which results in numerous container images whose +entrypoints lack the ability to gracefully handle the underlying child +processes. This is one of the main reasons behind the gradual shift in best +practices, as there is an increasing emphasis on adopting init processes such +as `tini`_, `s6-overlay`_, or `Pebble`_. + +What to expect? +~~~~~~~~~~~~~~~ + +* **client-server model behind a single binary**: Pebble is injected into + ROCKs as a single binary which acts both as a daemon and a client to itself; +* **declarative service definition**: the Pebble service processes (or simply + *Pebble services*) are declaratively defined in YAML files called layers;. + When compared to nowadays use of `imperative wrapper scripts (as suggested + in the Docker documentation)`_, this provides a much cleaner and less + error-prone way for defining the processes that should run inside the + container; +* **services as first-class citizens**: in contrast to wrapper scripts, Pebble + treats services as manageable units with a defined lifecycle and + service-specific definitions for health monitoring, inter-service + dependencies, restart policies, and much more; +* **layering**: Pebble can stack multiple layers into a single Pebble plan + where all services are defined. With this layering mechanism, existing + services can be overridden or re-configured; +* **container-optimised init process**: as the ROCKs' PID 1, Pebble acts as an + init process and thus offers: + * support for multiple child processes, + * reaping and subreaping, + * signal forwarding, + * graceful shutdown, + * log rotation, + * run the Pebble daemon and client commands in a single operation; +* **consistent user experience**: since every ROCK has Pebble as its + entrypoint, a predictable and consistent user experience is guaranteed; +* **embedded utilities**: regardless of the ROCK's contents, Pebble offers a + comprehensive array of commands for inspecting and interacting with the + container. These commands are especially useful for :ref:`Chiselled ROCKs + ` as they encompass functionalities such as listing and + deleting files, creating directories, and inspecting Pebble services, + among others. + +Creating services +~~~~~~~~~~~~~~~~~ + +Rockcraft follows the `Pebble layer specification`_ to the letter. Pebble +services are defined in :doc:`/reference/rockcraft.yaml` and you can also see +:doc:`/how-to/convert-to-pebble-layer` for an example of how to convert a +Docker entrypoint to a Pebble layer. + + +.. _Pebble: https://github.com/canonical/pebble +.. _tini: https://github.com/krallin/tini +.. _s6-overlay: https://github.com/just-containers/s6-overlay +.. _imperative wrapper scripts (as suggested in the Docker documentation): https://docs.docker.com/config/containers/multi-service_container/#use-a-wrapper-script +.. _Pebble layer specification: https://github.com/canonical/pebble/#layer-specification diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index 5b6f7b95d..80b19657f 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -8,11 +8,12 @@ cloud-native software's security, stability, and reliability requirements. ROCKs were created with a focus on those values: -* **Developers experience**: Rockcraft uses a declarative format to describe ROCKs, - aiming to simplify container image definition and provide the best user experience. -* **Ubuntu Experience**: Built on top of Ubuntu, ROCKs provide reliability - and stability to users. They offer access to the latest features, ensuring - users can meet their needs. With long-term support (LTS), ROCKs images +* **Developers experience**: Rockcraft uses a declarative format to describe + ROCKs, aiming to simplify container image definition and provide the best + user experience. +* **Ubuntu Experience**: Built on top of Ubuntu, ROCKs provide reliability + and stability to users. They offer access to the latest features, ensuring + users can meet their needs. With long-term support (LTS), ROCKs images are regularly updated. * **Consistency**: ROCKs are consistent by utilising Pebble as the entrypoint. Learning Pebble allows you to interact smoothly with all the ROCKs. From 43653c80cf0e67ebb94c7375e57271c6e56b333b Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 31 Jul 2023 15:41:08 +0200 Subject: [PATCH 06/17] docs: revamp ROCKs explanation --- docs/.wordlist.txt | 2 + docs/_static/rock_diagram.png | Bin 0 -> 40580 bytes docs/_static/rockcraft_diagram.jpg | Bin 12969 -> 0 bytes docs/explanation/chisel.rst | 21 +++---- docs/explanation/overlay-step.rst | 2 +- docs/explanation/pebble.rst | 7 ++- docs/explanation/rocks.rst | 93 +++++++++++++---------------- docs/reference/rockcraft.yaml.rst | 1 + docs/reuse/links.txt | 1 + 9 files changed, 60 insertions(+), 67 deletions(-) create mode 100644 docs/_static/rock_diagram.png delete mode 100644 docs/_static/rockcraft_diagram.jpg diff --git a/docs/.wordlist.txt b/docs/.wordlist.txt index c57e3abec..28ac50e64 100644 --- a/docs/.wordlist.txt +++ b/docs/.wordlist.txt @@ -1,6 +1,7 @@ ACR autotools Autotools +centric Charmcraft cli CLI @@ -10,6 +11,7 @@ CMD declaratively dev Diátaxis +distroless dnf Dockerfile Dockerfiles diff --git a/docs/_static/rock_diagram.png b/docs/_static/rock_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..119c58291d45a29a2441e8ee1c70e12c16efc485 GIT binary patch literal 40580 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 literal 0 HcmV?d00001 diff --git a/docs/_static/rockcraft_diagram.jpg b/docs/_static/rockcraft_diagram.jpg deleted file mode 100644 index dee36d8bd69b89b3fe30186da0b64cb802a09258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12969 zcmdUV2UJu^v+z}16_G_iKtMo=5|kxNHV`CB7=|P$QD+E}(*TPKN|r2PU?m7lU?dEA zKqY4hGvu6e9x}XP_uFsTbKdUT@BHU~|M_dq+^+7b+tt-w)uH+x_a2V|S5%c$lz=m5 z0N@Pi2ON)|=~a37(Co2}mXeCP;%|fofCT4$0suRE7bhL%2R951jc!~R{q2nt+A|C1 zmnZ380I6Og;iPr|=(_zEJbzbAZfWIgL1I`X{W+aT!by$2O2V(&{D$8;!OefeWlnH+ zmzORip2sJ+lb+5)5^hPtZ`qu}%}?PLFP%>KLrFX`cDAl3vQFTn#h0z@LAs>$BI$n} za0YY$W#GYy{-it!9MS;b?iK)$z5k=kJOKcT0|4M!{~u+XzW@N$8vrP3|D)`WK6&}f z>DjNtMk0qg+_ z;0_5B27UsB0P*7i;2}VE_5@CzWF$Cu{@e*%Jb(U&^W+yVT_V3oPJZb!)#XbRKT?pB zQ&Lm@NOk23^_5GPX=rJ#(30>gCzYHzd6VqiMbe8`D99;DrT-xue*vg3o=G}`Av?nk zoTWZPMt$bE24Fd{HL^1&@VmMfemH-T?A)2Nnt@HH6RZh1A1S6r~Jn$RlOt%f?HO?=HNl# zG zxekkgL$NoE*)HlGdCKHgarQ1auE?wr)$FU+G={kAs*0@d*g#BMd$BAnl*o_~n@o?7 zF!%J0I2D5)wI{kQ`uwrfS1GqOCIbeF?dr8mt`_=k4uxq+8J4HYf1A%ZWMPANLfUW$ zc-ul3CVe;5mX-bPtJ*>IHDW@?%PnDvPbuo4I{g%;AD7DJ3(7cyN1|4uHvK#K!QZpJ zX0Q9C;!CM~2J&~M;&1dn339cm$8&>_DxX#74EsaPOJ{QxAP5(;`6F}cnAO&H$$`Ad zf^vE)uJ_g=R@Hsw?$D;T0dylF?k=icdlkkMTvw^4f6*Wt4His9)Ih%#=+-LJ4z!nF z8!!ysDS|pJ-Dw^CI*h!3D<3Szir?r zNoWZ7R6=h?Vz^|dBva8k<;u!}C@!){T!`9Ncj#dDYKyY0qmr|vvspTp-&QAhb2+7z zLM*49g_lM;{MBGy5$;XELZ@P|GSSPs%thC@!6SFvgQK>bj{9qLJWqW6cvPX$w5l|9 z(fFg;+X8~QQBvgtml2Idc*_*y$XwGNm)OYz{tfX7H}Mr_Q>lJ~I@^-VxhexnnuBpr zE2tWUT~8*b22%A=SxxGNAZe3eYn`72tkhO&1sOfMG!=I+&))=b|j0_gx=;pS}s9NP@D}=#5_y#7- z3n4z0a3g3b=Pc4R#dd*N?%|>Q%^}g-(AT9B_p?6EY}GF?+P!|fKbvJ9Fc=nGi0W=0 zvCHrl5U#*j=ApgjI-cq2xuEA$-rlLws;0UHk^1DU-(A2|q~eZdXVH3E9FQg2|} zN6u!Sp&qRDM)?>(s0WdaFlce5Ho>x7E?x47BV=1S=h?36RZoa57?arzxQ5VkxvFbG z2;2qNwZTr3(gJ))y4lGk&6-$~?7?x5;Bhv8O9yF-vYI-n*Os{lT*Us=F^o5F8P@e} zYf)e7^{}w-;z~FRKL`f08MatSQ;Z7ad0suX;lUZgA3iv%?TQrHmRK$lhO36~WvF#w zw^H)?TxWyv4qk{fpTU*-QVnAVOj}&hZD*E;X0Np|hNUW~S`gudNn^exR`jvTs?l-; zU)#W?9L+ z^(S~_N2{Jj%v%rDB#!9rVp+uIhq>`SiR3yRcrrA3PydEhFB}Dx=+;gk$F~=!`OrpH-X-1?%>13j zS5*j55gfRn^a=YGND7F3If62EBl>GC=AOGyn-yMlZ5O;?0oi`HQ@GYM!NzxJYiGK~ z_X|1r|9{$#u2Z>OUmSDE$cpEg9k}jCz4qvuXCIh^2X4~bw|Q1i$h#W5I26Tbuwxw? z+>_VXG4GWt5@a9c9f7jJ#n1&fE?UHAV?|)gJZvJHcw7W-$2tCx?Yw<`^FxC^#6?+2-~=q;hBZP!F9m_1f@+&*maS1NAYDn!$av$G|2<@2?$0 z+GCzF9dZztiNpc}9QTXvKEMB2#IG!8Z6Zclr0Fte%dF*j6a6dPy>JKIDg_Gh20I-~ z-mJ%fU|vfiuT`K@I&Eo`bQUx+S6y8B+j6E)g2`3y${97)w!svlmO9$2+>t(2CWI@{ z)quYHWz)87=fkUuLBkeZ#p$v1O~41+1Imz=CHL*yX1;@>uyE@_IuUvAIH)qc=3OIH zkd@UtZly;AL31^#ctMDm^qv?_{>JJ=9kq7v>c-=82fBiV9UNqcSv*cj8O$1ez_Qkm zGs8J#TiVQ@;auKZ&yHAWxxIe%52217HPo5%WHR10g6kNA@rW&f)K0RVPaeVE6xMz8&;)0N?Rv!DV( z0YzE9LCJK`H zJe`jSb`OY1*P`?NG*R{H2R$0h>AW28Fuh!u3}`PY{D?H$s8*iJlgm$!P?`LY4%s7i zWxn)dTi8XI_@^H*bA%9H=wUDTwuf2lbA^lJa4p`6IEKz1KEaQAKgN<&IP)j3%s|!@ zBT>qQl(b9w0w*foO{%r80+q^vn(g-Jp}aB0W~TdXt<}Ma&u?{FhT4@RxS|aZetZRG z2FXMzYt_0m6+9C>|M`Ff`P!#3tYYb+)B!=*Ry9b_TB%zMeLxS2EB=O5=6H&odNd=M z;>^~MoSnTOHE-gIlc>2`YH|!DX-U%`MmH7kp7-}MrvI#|Qb}oKvOb`idTxh5EoAh_ z2p5%yh~!V2z7uxg;`)zO-wqsg!(3!?X{{PpmzBahI1T#J3S{Fn-grX>^jsW_Sye4L z0wo&i(*#gq2Jdjvt7mF@bFatCwSedd8Mth-$?F2dm!do4#Jph4Rna@*-6KG;Ounb^ zc2BsCWaPIk2d((wEi<*m=@$pv?|R3_$@B8=H%K_{mh!*wloq%7+Ng=Y#hJvn%R(6} z;)>+?dNZg4tO&tbtS4tdewJ?w1ye7+ob3<%arrHj@?Cm;%hzgs``e9Eixxy{gVZqs zzp^Q0gsgyFDm}e&Ij^b-WZS9$at&D#;d!-oCZwG^E4IIgLef@O7+k<)_2Cnm`PRd8 zJKKUR`*K1$ z0rEeLoUbM;wW=WE`8B^`fBoO60C0L9;>$n=9-40y7hdwSdU*qMkHqtr?x6asSDpop z8{-Ka{pW*-NP3dH1UY~WBAzqx^rH-ZT^wlyuNKdam*fZP@;F_JnOiZE4WZ|WWV|jU z^1M#6-8=p}A&nhDT0XA4v94NE8?A^Jgbu3J_S~{&Z?H^%D~Pqu7pNW+>h47>&$;J4on99&K63cFv;4zOP^x^a*!d%qDZOLB zbGZUkJC6g0ZCRP^9oA!xf$v8Hbuy6lg!-~(KW^?azt2?ugG1GqcMr-lCDv!=c~+=+ zoZHVA%xs7Uk2L4$Y7H~Stxf;jo{$b*I{45)dze+=;=`LNqV-K;-C|se=#Q4J;W;BR zv+~d(&WE-&u}|VmSs$rsW>? zP0&JzwjZj3CPqQ)>LE2X?dorf!*#V9nTbYYF?+$d_}fmb^(9O33(e6z1zs9n*Cd5( z;W<$$Si%I!ZjYrQhWerDHBAIFB5ex5L~b3wEAh1Z>gh$ib_99V`ie&kWM9b5!C zQE$`ws^&#!?qI`bk=ZrNmf>^#lhF5~aXa}TEN?R_?GlA8Tx_Rgh6cHHD#2qCJQ2)B z-dcw90s^+Ic97_1HrvjFZe=3hrq=6dn1Tb$4zu8$$_p(l*(TerjxY)674EQt_Sdzl zF6M(lF4WB|fpQlkTP-2Mm@xJ@&0K}S7anF4J0>y02_{5~C+PF~MIt6R8H$KHO$;`4#&W}djl>jby7l)?jvg*J6_J88m1kxxUF(vs5j5+P1pI76I0u&nm_ z=@J~e65CLhcHv9%M56=-{AKj6K7Z-X%PUKaw(8{qFI)8kl4xsnuBA?* zbWI|$pTG(;^%U1@9a1J|w{|Djs0w}R28g2H#rE!^9c+@oua<3IhOnLMtbJx4hY#X> zU4(OSfMl7s@~7mQD|gT+`$T#?A>8WDR6EmPOrV!4sb5%^3sgO?W}pY*4@&0?Qzliksa(jZk(exJY-sM|!A^rryUosJ=+ZDBFf>};I0 zZW$XxBg}+a?PHs_|BLmnU_o-ZV4QrpvUm-<<#{rAZ(ShO^%x@m`3)moXdLM8_pE zs{Kxss^|9pU84Wn!&$ng|C->>f~tMf6ybboI5q+b924C=0DD{aU#r3vgNjW3A`!%)cB=wJm5K>k#j0@@^G)OaoHw>FDL$wvk-aZ;$Aqe z6qKoES$`mW-Ay&cv;fvqKQ(|9v3{kAa^fR4)RkksuwE{Ddh6H|sH&(aIe$yfm59WSQd}||ctIClm zNXIXh92)1A3?qt2P3r{8^O{zOX1-cCw^gHj>&0czfr+1#Z_~%k4u{XNRI3xVTR66s zvRD^f-~#&0Q|(-y9}{`f$K!a@oGpWuWV5Gn;m}Ck@7WLu8EHq^`H~L;<|3@VKdMDP zZcxs*oM@=MT{-gRQL*te0ofHLF~s(x+@<+$JqY5K^R#@bWP$AazFmIf0*qe754G2p zqIm)uxsalnrQn;%;njR%(MsC<&gY544@4_%}k@a?p^cOqtI|UA=&6Y2U)JmE`Q?FFJ z(vYUZjfs6scxRCDFrgf4jHlKBpV~C0KmF{1wxLiq{n}+`;wyDtAAL#kNgv5rb&;{8 z=(HCI1oDG}^pbbtwp`y4{nLC9wf-QI>HQD;(0|$QN%B8#aY+93uZ{fwi#^UiIl26* z4NdBb){)sU&=6~W>XhLepAB3<|b)wRvE0T-fXkdlZUCdPBcDe^gZUL#VaXu(7Nk z)8G+Qqj`K`AnQk=Vn*xBuBB;kIxa(g9Fji~(MGK5>ivOgC8Ab-N21ou(38!Ps#5;y zF)%tp=VLYLQ}e*VBWAj;ySPErc7dN>Fk-5)`BgNV#VAqOacVMcms!|gIV{}3J2AKi zX|z0?YZjxuVKUUX=hhfCj`L5fd+1vJzQ+*N4rVdON*As)%q}(TJTX^BA`WP8@<-oKlZrFd<(UJqlA;eJGoVr&q87E$?HA#a>2Nnm!9$S*Q~bpSgdK5fCQ%V1?) zZ&;gO{Y%1%PpoZgWNb2$NmvY;JQ6dhxbVF~+u>ff0LBoA>&^knHkL$MC<6=BP-7*~Di%ZP}|#*g0sm5qyhEq{Rx7 zSWs#ce%~r4BSR=D9&OIe&f*Xu$AIp@=^>zdd=7a!|7W8B-J`+$$x7sQ4s?%!*D%ml zeB?GY2zXG)YPiPLPzGmdCjSP5{vhx+X-XLyC0L}lKIH-(4EtIt4-e@|!=z_TivPK4 zUk~FgTGWyEzU7nwIe3IE*l*P#xH5lTZk+8;ql5UF>(9gW&1Ti~<}QUu_Wi|)qk;UABI$qE0R4@^_0lba~C!rY`e?D#T)5cAvh)t&GCbFI# zazokU3-wwjoD9?h$v>-*y)-DZhbB35m|EisbQ0+3<>1mFIxm0MbI8@khAM?+&>gPnvH{*qR;WRzP~{`B_zzLHpcUa@wL=pFA5ID<`Z)}B1=7H?Am z4g*O~oW{25=_!gGP*FNA7rQe@*Nl1AEY_1WER{ zLSEczMzsM20y^p33JI0YaZ0=Jp>WXRl6-P1{ZQZT_JyVaR%r?r77kjka2zLXawE+N>yO5>{?7 zt?1Pf5#NXuiMj~qbbwkpvqMwYJDMgzpx(6J9j`ngRKiubsq*a zuu8Y45^XB)-h_vFKeLFsgVQ$3o>JVYx||%csX1lVX@sd%9*d6j4H`u5se!f|7^B(eL@<0GF%iChd+0w4ibOz(~C|VWHhNmr`+?<7r?8PAiJH;y8GBLsf zLLaheuu8@_*+xSe7y;FVTgOq$k`GSJzI&JQMnUv1wLJ+O{Z&u=9gXbNI*v#t-CZ#= z+*%LhAGTZmYVkae;lVbsu_^Bq{`oZ1KgDTMDSXphQ``M)laZ(KfBODuzQ1o6RRqU}nz4Z= zyRb~v+r`#Wu7sAQAnp{!x$El7ddsA6MVOWc zNX`yZ)IhkQN4$3IY71}L-QDH@-5Y5jmzhHQ~6o1o%PmQTB&`p8p zc`=8>km4cJ zMv0yCRc$MSOSdS=;aZYX8tsXVnN`nJHr(!T%Pq!nZj{?Zmv*D8(g(Pn54UqMGACVC z&7N`HdU6aX;0g^odF@M>nOW{u>|cAA|G08dXj5?oc5y`rJv)s7X{PeZ&qH=bt_ocu(P`Q?HbDYU0#6{W9FfgxipTZTfgLbwF zt}8WrnQ3O#Ufs;d?7^TL&FG{gF6;lj(J5G}TTJKqk&aNOLQNzZ-X<+C*1$wxtjp_X zKD2tRtXHCzUI$uw>uGq%6!ZzRjq_j-4QUC$vUDLN>7=$E&fuD4Y(lK*cJC+>_#`Zq za_MZEd%}btEf3?-gPR*=+r?QnrnpAZXDno?6;i{!`7(I{rFpg=4%VwwTMo`1UXKk8 zb$YBm&t(m}Y*Vw>^m3sESIbA@U8D0zZDs5Vx`t54v@4e+W>bb0MBiV49jgbK!(kbE( z{0k|FiV>WXw5zuqPx^46;GVM}UGD732BM5$uu;WI}0r7hxTLl0{M{RHEve2dnD|1H%N%Z8p0z@ z9+-DMY4joN7~PAb7c3oC{?-8tQ1RM*B7;@lTGD%b!)|q?iIHO0PMOP{w2t%^wHyfw zH}~H9{Jk;S`u>gR$$O>X=02Z173RTE%^rSBePMA{M&BD#heg~buLGW-8v`a5#n19> zSP3=l_Xzbt;^`~+FSkRVxxB>Pgax;&!H0WsEDoN6v?e?uNYlju81Y74fJP9TGPT!C zeCUcd3q*^Z0i~U{hRf&Qhha4%mgeEGgmG|KdaGRtEM!AWSEo_CR?6ku5WJLvel+;G zMRw$asr+ru#*Rq$QX}{*JUIMuywUevrx~6n(<&aw8(7{IQSnQA6YCyRRc=XQeR;Xw z;4!xIwrd6noJw+*5NvSv(ek^e#l94iD59=V6y~GN=MQ!>>TgZ3=y`^%>4)J?CJkx= z`cn;HKMO9q+2LJYj=`uRtEKoNp18sIAp6^OUqjjr`d(C{hij&tiUbXUC-wP0iQ|om zuI)8H0fk&ID(AAz4SzJ)tq^t$Gzl0g%q;V(n=13)alU!he5I$(Aj{%{@AX&xpSxYC zl~qm>IO|wXOh9898UDAsOWC{m)@nmfC zym#Kd+K)v|%-f1DnhZ>pp6AZE>z!{9r5auPLy;QoGjNZKuojbQGzY!tigTH`1oHXQ ze`2b?@unlHTRd#;xJ%>es(R#Kg85}Ikj7+dwe$_=Ej2vTkJnS_E7 zRoIj`R<|Agq%}9;?~q*>lZ8{CI=#-~%faFRGDG5j(@u_`pKT>$DIQGOfxE*+vSE7Q_8wXN2s^`-jA z7**`z0`VttXQr}rsQpi0MH8R|Grno356x?ym=vBzm1bWB>b51DAQH*AC@Dm&cXf-Ir7+uHt!PwmGn%`KJjxFPWje0hRrn`NXsMxR|0f!8xJZJm(w z;b902aqkpETUh7i6u)d5EhtBca=k)DH8nuGU9cT?gI@R9QL4R0_3UDu>D2ftAJijArhQp@M1WAH+v%wg$;+(szFmT)7m zNn>BV98VE`IlosgJfu^FZR#LPqDU?ncZW2C{Zshc{Si~qM*85OvC7WUzBS%fXTx~r zSq5SSz3H!=w={nJWgvdCL|8qntTbb)bvotCp!rz7WRrbewFAFe z8!WF@N<1~HHmtKDH0t7bWcD_!5`ie}O}7;i=0?U|>xS?r=Q^eN;lZ8AV_-{b@tiT|Af|y>~QmT2~ICFGS ziw}=!VFOKVJhshJ2#J@@a1v@FZ7?@Y-y8!I7GoB3w`?09VJxK@+JT)g&dq|eA*4ytehH~Q@p$8=$f`to}(~CLJ z=@9QbzIYL0$IrEER3PxgyHjpPOuEcvK06@$7!dVaEh!!wd36`bk8=Xcu6>gC9$YGo z<2N11TgrP7U{m`3+oa0~mnrF^QqU~!de6h2&aNWg(`ugFOrOsGS?&8l_@Y*@=T}g_ z3p$DJ^E3PHlS}Gyma+n(Y>S^|9`eI-PhP8O$gDGnp)=U(=l`U?V?8vFLas|J9s{K2 zY5t6e!jO-2SOgxXE{x25|NZkEE>k9-Csv2QIQT*G1N34&UTnF>6a8_Ah^F5;{+UQF zQ`)MuddhwIo~o{2NOz^*+&2xzs%-YQ_gqM^^qWi(H+TFeQQ$FYrTW>{?wKa7^U`F# z%o>d&A1Sl$E!?T>t4Lgz<$$3=Mmu>FEuOIRA+n01$K_xtJr4QJiOPKxe+*qYHWsQ?nSXg17-cdZ{I2{ z9V{0H1klPZP8_gRISOp6Q;`GpyJ(dh)nyTp@Om>$y1unjRrN%i+yWz;nAtOS%XSC{ zBSp&ayY2E$Warb%zE#2d0seJkGRJ`Yvd>+}E)It~GN#52Nntc`Qk(Oi?g9Thruyr! zkpF40{w(+(j~j`R^ckV_xB8B(;3{3mk*{o5S18z&Quq!v>iy201kO(9VY(FpK1?3S zEeVzb8Uzq~I#0c(xth26VjR;w=)S6&eHL^&uY6hr-!GRn(K+*F;+JyKnb5mvKMJ*~ n(cZ-;x8^~wam(KO>|soG+p^0}n_6ngh{{-9fq!emcHH-01x|p5 diff --git a/docs/explanation/chisel.rst b/docs/explanation/chisel.rst index 91d984c4a..c19524405 100644 --- a/docs/explanation/chisel.rst +++ b/docs/explanation/chisel.rst @@ -12,16 +12,6 @@ needed for the ROCK to function properly. See :ref:`how_to_use_chisel` for information about using the tool. -Slice definitions ------------------ - -A slice is a yaml file permitting chisel to slice the package, -`here `_ is -the slice definition reference. - -To find more examples or if you want to contribute, -check `chisel-releases `_. - Package slices -------------- @@ -54,3 +44,14 @@ could see as a block of stone from which we can carve and extract only the small and relevant parts that we need to run our applications, thus keeping ROCKs small and less exposed to vulnerabilities. +Slice definitions +~~~~~~~~~~~~~~~~~ + +A package's slices can be defined via a YAML slice definitions file. Check the +`slice definitions reference +`_ for more information +about this file's format. + +To find examples of existing slice definitions files, check the Chisel releases +repository at ``_. Contributions +are welcome and encouraged. diff --git a/docs/explanation/overlay-step.rst b/docs/explanation/overlay-step.rst index 8d5cc9d7c..1694c2637 100644 --- a/docs/explanation/overlay-step.rst +++ b/docs/explanation/overlay-step.rst @@ -5,7 +5,7 @@ The component parts of a ROCK are built in a sequence of five separate steps: pull, overlay, build, stage and prime. The overlay step is specific to ROCKs and is configured with overlay parameters. -To learn more about pull,build,stage and prime see :doc:`/reference/parts` +To learn more about pull, build, stage and prime see :doc:`/reference/parts` .. Include a section about overlay parameters from the Craft Parts documentation. diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index 7da3890e1..dbdccab79 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -21,10 +21,10 @@ Containers' best practices advocate the separation of concerns and the adoption of a single service per container. With the introduction of `Pebble`_ as the ROCKs' entrypoint, this principle is elevated to new heights: - if multiple processes rely on shared dependencies and are tightly coupled + *if multiple processes rely on shared dependencies and are tightly coupled together (i.e. they serve a single purpose and cannot be executed independently), then the best practice entails orchestrating them within the - same container, with `Pebble`_ as their manager. + same container, with `Pebble`_ as their manager.* This new notion addressed existing pain points arising from the excessive separation of concerns, which results in numerous container images whose @@ -53,6 +53,7 @@ What to expect? services can be overridden or re-configured; * **container-optimised init process**: as the ROCKs' PID 1, Pebble acts as an init process and thus offers: + * support for multiple child processes, * reaping and subreaping, * signal forwarding, @@ -81,4 +82,4 @@ Docker entrypoint to a Pebble layer. .. _tini: https://github.com/krallin/tini .. _s6-overlay: https://github.com/just-containers/s6-overlay .. _imperative wrapper scripts (as suggested in the Docker documentation): https://docs.docker.com/config/containers/multi-service_container/#use-a-wrapper-script -.. _Pebble layer specification: https://github.com/canonical/pebble/#layer-specification +.. _Pebble layer specification: https://github.com/canonical/pebble#layer-specification diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index 80b19657f..81945da40 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -3,62 +3,49 @@ ROCKs ===== -ROCKs are Ubuntu-based container images that are designed to meet +ROCKs are **Ubuntu LTS-based container images** that are designed to meet cloud-native software's security, stability, and reliability requirements. -ROCKs were created with a focus on those values: - -* **Developers experience**: Rockcraft uses a declarative format to describe - ROCKs, aiming to simplify container image definition and provide the best - user experience. -* **Ubuntu Experience**: Built on top of Ubuntu, ROCKs provide reliability - and stability to users. They offer access to the latest features, ensuring - users can meet their needs. With long-term support (LTS), ROCKs images - are regularly updated. -* **Consistency**: ROCKs are consistent by utilising Pebble as the entrypoint. - Learning Pebble allows you to interact smoothly with all the ROCKs. - -ROCKs comply with the `Open Container -Initiative`_ (OCI) `image format specification `_. -ROCKs can be stored in container registries (e.g. DockerHub, ECR, ACR,..) -and used with any OCI-Compliant tools (e.g. Docker, Podman, Kubernetes,...). +ROCKs comply with the `Open Container Initiative`_'s (OCI) `image format +specification `_, and can be stored in any OCI-compliant +container registry (e.g. DockerHub, ECR, ACR,..) and used by any OCI-compliant +tool (e.g. Docker, Podman, Kubernetes,...). Interoperability between ROCKs and other containers also extends to how -container images are built. This enables using ROCKs as bases for -existing build recipes, such as Dockerfiles, for further customisation and -development. - -The ROCKs ecosystem comprises - -.. figure:: /_static/rockcraft_diagram.jpg +container images are built. This enables using ROCKs as bases for existing +build recipes, such as Dockerfiles, for further customisation and development. + +What sets ROCKs apart? +~~~~~~~~~~~~~~~~~~~~~~ + +* **Opinionated and consistent design**: all ROCKs follow the same design, + aiming to minimise your full-stack disparity and adoption overhead, i.e + + * :ref:`pebble_explanation_page` **is the official entrypoint for all + ROCKs**, thus providing a predictable and powerful abstraction layer + between the user and the container application; + * ROCKs extend the OCI image information by including additional **metadata** + inside each ROCK (e.g. at ``/.rock/metadata.yaml``), allowing container + applications to easily inspect the properties of the image they are running + on, at execution time; +* **User-centric experience**: ROCKs are described in a :ref:`declarative + format` and **built on top of familiar and reliable + Ubuntu LTS images**, thus offering an open and up-to-date user experience; +* **Seamless chiselling experience**: ROCKs can be effortlessly + :ref:`chiselled` using off-the-shelf primitives, + harnessing all the advantageous traits of "distroless" to deliver **compact + and secure Ubuntu-based container images**. + + +Design +~~~~~~ + +Given their compliance with the `OCI image specification `_, +all ROCKs are constituted by OCI metadata (like the image's index, manifest and +configuration) plus the actual `OCI layers`_ with the container filesystem +contents. + +.. figure:: /_static/rock_diagram.png :width: 75% :align: center - :alt: ROCKs ecosystem - - -Chisel ------- - -Chisel is a software tool for extracting well-defined portions -(also known as slices) of Debian packages into a filesystem. -To learn more about Chisel see: :ref:`chisel_explanation` - -Pebble ------- - -In ROCKS, Pebble is the default entrypoint (an executable that -runs when the container is initiated) in ROCKS, ensuring consistent -container inspection and permit to have multiple entrypoint -without the need to create other files.To learn more about -Pebble see: :ref:`pebble_explanation_page` - -Rockcraft ---------- - -Rockcraft is a tool designed to build ROCKs using a declarative syntax -(yaml). It leverages the logic of plugins, parts,and concepts that exist -in Snapcraft and Charmcraft. - -Developers familiar with the creation and publication of snaps and charms -will be able to utilise existing knowledge to create ROCKS. -To learn why you need to use Rockcraft see: :ref:`why_use_rockcraft` + :alt: ROCK diagram diff --git a/docs/reference/rockcraft.yaml.rst b/docs/reference/rockcraft.yaml.rst index 8a5fbc8e3..77e210b08 100644 --- a/docs/reference/rockcraft.yaml.rst +++ b/docs/reference/rockcraft.yaml.rst @@ -1,3 +1,4 @@ +.. _rockcraft.yaml_reference: ************** rockcraft.yaml diff --git a/docs/reuse/links.txt b/docs/reuse/links.txt index 59e1af27a..6e63bb94d 100644 --- a/docs/reuse/links.txt +++ b/docs/reuse/links.txt @@ -4,6 +4,7 @@ .. _Docker: https://docs.docker.com/ .. _`OCI archive format`: https://github.com/opencontainers/image-spec/blob/main/layer.md#distributable-format .. _OCI_image_spec: https://github.com/opencontainers/image-spec/blob/main/spec.md +.. _`OCI layers`: https://github.com/opencontainers/image-spec/blob/main/layer.md .. _LXD: https://linuxcontainers.org/lxd/docs/latest/ .. _Multipass: https://multipass.run/docs .. _`Open Container Initiative`: https://opencontainers.org/ From 0f7aa0613c49e82da8e0e962d3a04c9a9fcd4477 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 31 Jul 2023 15:41:24 +0200 Subject: [PATCH 07/17] fix: pyright errors --- Makefile | 2 +- docs/conf.py | 1 + pyproject.toml | 3 +++ tests/integration/plugins/test_python_plugin.py | 9 ++++++--- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 4bbb6bdde..85133bde1 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ test-pylint: .PHONY: test-pyright test-pyright: - pyright . + pyright . .PHONY: test-shellcheck test-shellcheck: diff --git a/docs/conf.py b/docs/conf.py index 2ea9ac1e5..be47d3195 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -218,6 +218,7 @@ typehints_fully_qualified = False always_document_param_types = True typehints_document_rtype = True +linkcheck_anchors_ignore = ["slice-definitions"] # Enable support for google-style instance attributes. napoleon_use_ivar = True diff --git a/pyproject.toml b/pyproject.toml index 7b7877f82..8204cb520 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,9 @@ line_length = 88 # are not overwritten. extend-exclude = "docs/sphinx-starter-pack" +[tool.pyright] +ignore = ["docs/sphinx-starter-pack"] + [tool.mypy] python_version = "3.8" exclude = [ diff --git a/tests/integration/plugins/test_python_plugin.py b/tests/integration/plugins/test_python_plugin.py index 221cf9536..996fa620b 100644 --- a/tests/integration/plugins/test_python_plugin.py +++ b/tests/integration/plugins/test_python_plugin.py @@ -123,7 +123,7 @@ def test_python_plugin_ubuntu(base, tmp_path): # Check the extra sitecustomize.py module that we add expected_text = SITECUSTOMIZE_TEMPLATE.replace("EOF", "") - version_dir = VALUES_FOR_HOST.version_dir + version_dir = VALUES_FOR_HOST.version_dir # pyright: ignore[reportUnboundVariable] sitecustom = tmp_path / f"stage/usr/lib/{version_dir}/sitecustomize.py" assert sitecustom.read_text().strip() == expected_text.strip() @@ -144,7 +144,10 @@ def test_python_plugin_bare(tmp_path): bin_dir / i for i in VALUES_FOR_HOST.symlinks ] # (Python 3.8 does not have Path.readlink()) - assert os.readlink(bin_dir / "python3") == VALUES_FOR_HOST.symlink_target + assert ( + os.readlink(bin_dir / "python3") + == VALUES_FOR_HOST.symlink_target # pyright: ignore[reportUnboundVariable] + ) # Check the shebang in the "hello" script expected_shebang = "#!/bin/python3" @@ -154,7 +157,7 @@ def test_python_plugin_bare(tmp_path): # Check the extra sitecustomize.py module that we add expected_text = SITECUSTOMIZE_TEMPLATE.replace("EOF", "") - version_dir = VALUES_FOR_HOST.version_dir + version_dir = VALUES_FOR_HOST.version_dir # pyright: ignore[reportUnboundVariable] sitecustom = tmp_path / f"stage/usr/lib/{version_dir}/sitecustomize.py" assert sitecustom.read_text().strip() == expected_text.strip() From 399527289f755a4614a432a715579be42dc05358 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 2 Aug 2023 12:52:22 +0200 Subject: [PATCH 08/17] fix: address reviews - improve explanations --- docs/.wordlist.txt | 1 + docs/explanation/chisel.rst | 7 ++++--- docs/explanation/pebble.rst | 15 +++++++++------ docs/explanation/rocks.rst | 25 ++++++++++++++++++++++--- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/docs/.wordlist.txt b/docs/.wordlist.txt index 28ac50e64..2d054c0b6 100644 --- a/docs/.wordlist.txt +++ b/docs/.wordlist.txt @@ -68,6 +68,7 @@ Rockcraft's ROCK's ROCKs runit +runtime Runtime scons SCons diff --git a/docs/explanation/chisel.rst b/docs/explanation/chisel.rst index c19524405..e870b9158 100644 --- a/docs/explanation/chisel.rst +++ b/docs/explanation/chisel.rst @@ -52,6 +52,7 @@ A package's slices can be defined via a YAML slice definitions file. Check the `_ for more information about this file's format. -To find examples of existing slice definitions files, check the Chisel releases -repository at ``_. Contributions -are welcome and encouraged. +.. note:: + To find examples of existing slice definitions files, check the Chisel + releases repository at ``_. + Contributions are welcome and encouraged. diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index dbdccab79..cb1b3bfcf 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -29,28 +29,31 @@ ROCKs' entrypoint, this principle is elevated to new heights: This new notion addressed existing pain points arising from the excessive separation of concerns, which results in numerous container images whose entrypoints lack the ability to gracefully handle the underlying child -processes. This is one of the main reasons behind the gradual shift in best +processes. This is one of the main reasons behind the gradual shift in the best practices, as there is an increasing emphasis on adopting init processes such as `tini`_, `s6-overlay`_, or `Pebble`_. What to expect? ~~~~~~~~~~~~~~~ +Pebble distinguishes itself from other similar tools (like `tini`_ and +`s6-overlay`_) by offering the following core features: + * **client-server model behind a single binary**: Pebble is injected into ROCKs as a single binary which acts both as a daemon and a client to itself; * **declarative service definition**: the Pebble service processes (or simply - *Pebble services*) are declaratively defined in YAML files called layers;. + *Pebble services*) are declaratively defined in YAML files called layers. When compared to nowadays use of `imperative wrapper scripts (as suggested in the Docker documentation)`_, this provides a much cleaner and less - error-prone way for defining the processes that should run inside the + error-prone way of defining the processes that should run inside the container; * **services as first-class citizens**: in contrast to wrapper scripts, Pebble treats services as manageable units with a defined lifecycle and service-specific definitions for health monitoring, inter-service dependencies, restart policies, and much more; -* **layering**: Pebble can stack multiple layers into a single Pebble plan - where all services are defined. With this layering mechanism, existing - services can be overridden or re-configured; +* **layering**: Pebble can stack multiple layers (represented as YAML files) + into a single Pebble plan where all services are defined. With this layering + mechanism, existing services can be overridden or re-configured; * **container-optimised init process**: as the ROCKs' PID 1, Pebble acts as an init process and thus offers: diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index 81945da40..e08e17342 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -41,11 +41,30 @@ Design ~~~~~~ Given their compliance with the `OCI image specification `_, -all ROCKs are constituted by OCI metadata (like the image's index, manifest and -configuration) plus the actual `OCI layers`_ with the container filesystem -contents. +all ROCKs are constituted by OCI metadata (like the image's `index`_, +`manifest`_ and `configuration`_) plus the actual `OCI layers`_ with the +container filesystem contents. + +Typically, container users won't be directly building or accessing the raw OCI +components that form an image. However, these are frequently used as the +underlying source of truth when inspecting container images with tools like +`Docker`_ or `skopeo`_. As an example, the command ``docker inspect`` will, +in its majority, source the requested information from the image's OCI +`configuration`_. + +On the other hand, the `OCI layers`_ are the literal filesystem contents that +result from the user's instructions at image build time, and that can be +accessed by the container application at runtime. + +The following diagram depicts the different OCI components in the context of a +ROCK, highlighting where the aforementioned design features (like the Pebble +entrypoint) fit in. .. figure:: /_static/rock_diagram.png :width: 75% :align: center :alt: ROCK diagram + +.. _`index`: https://github.com/opencontainers/image-spec/blob/main/image-index.md +.. _`manifest`: https://github.com/opencontainers/image-spec/blob/main/manifest.md +.. _`configuration`: https://github.com/opencontainers/image-spec/blob/main/config.md From dacc8131ee06a4359830e9113ad32e65ae3538da Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 2 Aug 2023 13:29:25 +0200 Subject: [PATCH 09/17] fix: bad link --- docs/explanation/pebble.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index cb1b3bfcf..50d48ab25 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -24,7 +24,7 @@ ROCKs' entrypoint, this principle is elevated to new heights: *if multiple processes rely on shared dependencies and are tightly coupled together (i.e. they serve a single purpose and cannot be executed independently), then the best practice entails orchestrating them within the - same container, with `Pebble`_ as their manager.* + same container, with Pebble as their manager.* This new notion addressed existing pain points arising from the excessive separation of concerns, which results in numerous container images whose From 58b395f881138a2eeb2014af26af7bfd52268a03 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 2 Aug 2023 15:54:08 +0200 Subject: [PATCH 10/17] fix: rename section --- docs/explanation/chisel.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/explanation/chisel.rst b/docs/explanation/chisel.rst index e870b9158..555261746 100644 --- a/docs/explanation/chisel.rst +++ b/docs/explanation/chisel.rst @@ -44,8 +44,8 @@ could see as a block of stone from which we can carve and extract only the small and relevant parts that we need to run our applications, thus keeping ROCKs small and less exposed to vulnerabilities. -Slice definitions -~~~~~~~~~~~~~~~~~ +Defining slices +~~~~~~~~~~~~~~~ A package's slices can be defined via a YAML slice definitions file. Check the `slice definitions reference From 7df86b6a546775e574e609ca2dc388240d96e030 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 14 Aug 2023 14:00:19 +0200 Subject: [PATCH 11/17] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 85133bde1..2fef1551b 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ coverage: ## Run pytest with coverage report. .PHONY: preparedocs preparedocs: ## move file from the sphinx-starter-pack to docs folder cp docs/sphinx-starter-pack/.sphinx/_static/* docs/_static - mkdir docs/_templates || true + mkdir -p docs/_templates cp -R docs/sphinx-starter-pack/.sphinx/_templates/* docs/_templates cp docs/sphinx-starter-pack/.sphinx/spellingcheck.yaml docs/spellingcheck.yaml From e75a00b873a8cf58533d661d5bf907c9760d3a73 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 14 Aug 2023 14:00:43 +0200 Subject: [PATCH 12/17] Update docs/explanation/pebble.rst Co-authored-by: Tiago Nobrega --- docs/explanation/pebble.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index 50d48ab25..7f49f6e0b 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -8,7 +8,7 @@ Pebble Similar to other well-known process managers such as *supervisord*, *runit*, or *s6*, `Pebble`_ is a service manager that enables the seamless orchestration of -a collection of local service processes as organised set. The main difference +a collection of local service processes as an organised set. The main difference is that `Pebble`_ has been designed with custom-tailored features that significantly enhance the overall container experience, making it the ideal candidate for the container's init process (also known as the entrypoint, From 691501e3a0c9c1b0e2fc7265d1f8df43469e5b64 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 14 Aug 2023 14:01:01 +0200 Subject: [PATCH 13/17] Update docs/explanation/rocks.rst Co-authored-by: Tiago Nobrega --- docs/explanation/rocks.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index e08e17342..684d0b7b4 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -19,7 +19,7 @@ What sets ROCKs apart? ~~~~~~~~~~~~~~~~~~~~~~ * **Opinionated and consistent design**: all ROCKs follow the same design, - aiming to minimise your full-stack disparity and adoption overhead, i.e + aiming to minimise your full-stack disparity and adoption overhead, e.g. * :ref:`pebble_explanation_page` **is the official entrypoint for all ROCKs**, thus providing a predictable and powerful abstraction layer From 0423a909903e3a718e79461529b6d319121be884 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Mon, 14 Aug 2023 14:44:09 +0200 Subject: [PATCH 14/17] Update Makefile Co-authored-by: Sergio Schvezov --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2fef1551b..e1703debc 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ test-pylint: .PHONY: test-pyright test-pyright: - pyright . + pyright . .PHONY: test-shellcheck test-shellcheck: From 202f94d3ab4335fc817e5aec5e4511a1424a1781 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 16 Aug 2023 08:51:26 +0200 Subject: [PATCH 15/17] Update docs/explanation/pebble.rst Co-authored-by: Alex Lowe --- docs/explanation/pebble.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index 7f49f6e0b..2040795dc 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -26,7 +26,7 @@ ROCKs' entrypoint, this principle is elevated to new heights: independently), then the best practice entails orchestrating them within the same container, with Pebble as their manager.* -This new notion addressed existing pain points arising from the excessive +This new notion addresses existing pain points arising from the excessive separation of concerns, which results in numerous container images whose entrypoints lack the ability to gracefully handle the underlying child processes. This is one of the main reasons behind the gradual shift in the best From 20695adb7bf37500366dcb899c3d7e49cfe856a0 Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 16 Aug 2023 09:51:32 +0200 Subject: [PATCH 16/17] Apply suggestions from code review Co-authored-by: Alex Lowe --- docs/explanation/pebble.rst | 23 +++++++++++------------ docs/explanation/rocks.rst | 10 +++++----- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index 2040795dc..2fb194627 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -43,18 +43,17 @@ Pebble distinguishes itself from other similar tools (like `tini`_ and ROCKs as a single binary which acts both as a daemon and a client to itself; * **declarative service definition**: the Pebble service processes (or simply *Pebble services*) are declaratively defined in YAML files called layers. - When compared to nowadays use of `imperative wrapper scripts (as suggested - in the Docker documentation)`_, this provides a much cleaner and less - error-prone way of defining the processes that should run inside the - container; -* **services as first-class citizens**: in contrast to wrapper scripts, Pebble + Compared to `imperative wrapper scripts (as suggested in the Docker + documentation)`_, this provides a much cleaner and less error-prone way + to define the processes that should run inside the container. +* **services as first-class citizens**: unlike wrapper scripts, Pebble treats services as manageable units with a defined lifecycle and service-specific definitions for health monitoring, inter-service dependencies, restart policies, and much more; * **layering**: Pebble can stack multiple layers (represented as YAML files) into a single Pebble plan where all services are defined. With this layering mechanism, existing services can be overridden or re-configured; -* **container-optimised init process**: as the ROCKs' PID 1, Pebble acts as an +* **container-optimised init process**: as a ROCK's PID 1, Pebble acts as an init process and thus offers: * support for multiple child processes, @@ -66,19 +65,19 @@ Pebble distinguishes itself from other similar tools (like `tini`_ and * **consistent user experience**: since every ROCK has Pebble as its entrypoint, a predictable and consistent user experience is guaranteed; * **embedded utilities**: regardless of the ROCK's contents, Pebble offers a - comprehensive array of commands for inspecting and interacting with the + comprehensive suite of commands for inspecting and interacting with the container. These commands are especially useful for :ref:`Chiselled ROCKs - ` as they encompass functionalities such as listing and + `, as they encompass functionalities such as listing and deleting files, creating directories, and inspecting Pebble services, among others. Creating services ~~~~~~~~~~~~~~~~~ -Rockcraft follows the `Pebble layer specification`_ to the letter. Pebble -services are defined in :doc:`/reference/rockcraft.yaml` and you can also see -:doc:`/how-to/convert-to-pebble-layer` for an example of how to convert a -Docker entrypoint to a Pebble layer. +Rockcraft follows the `Pebble layer specification`_ to the letter, with Pebble +services defined in :doc:`/reference/rockcraft.yaml`. +:doc:`/how-to/convert-to-pebble-layer` provides an example of how to +convert a Docker entrypoint to a Pebble layer. .. _Pebble: https://github.com/canonical/pebble diff --git a/docs/explanation/rocks.rst b/docs/explanation/rocks.rst index 684d0b7b4..e33213cd7 100644 --- a/docs/explanation/rocks.rst +++ b/docs/explanation/rocks.rst @@ -12,7 +12,7 @@ container registry (e.g. DockerHub, ECR, ACR,..) and used by any OCI-compliant tool (e.g. Docker, Podman, Kubernetes,...). Interoperability between ROCKs and other containers also extends to how -container images are built. This enables using ROCKs as bases for existing +container images are built, allowing ROCKs to be used as bases for existing build recipes, such as Dockerfiles, for further customisation and development. What sets ROCKs apart? @@ -22,7 +22,7 @@ What sets ROCKs apart? aiming to minimise your full-stack disparity and adoption overhead, e.g. * :ref:`pebble_explanation_page` **is the official entrypoint for all - ROCKs**, thus providing a predictable and powerful abstraction layer + ROCKs**, providing a predictable and powerful abstraction layer between the user and the container application; * ROCKs extend the OCI image information by including additional **metadata** inside each ROCK (e.g. at ``/.rock/metadata.yaml``), allowing container @@ -30,10 +30,10 @@ What sets ROCKs apart? on, at execution time; * **User-centric experience**: ROCKs are described in a :ref:`declarative format` and **built on top of familiar and reliable - Ubuntu LTS images**, thus offering an open and up-to-date user experience; + Ubuntu LTS images**, offering an open and up-to-date user experience; * **Seamless chiselling experience**: ROCKs can be effortlessly :ref:`chiselled` using off-the-shelf primitives, - harnessing all the advantageous traits of "distroless" to deliver **compact + harnessing all the advantages of "distroless" to deliver **compact and secure Ubuntu-based container images**. @@ -49,7 +49,7 @@ Typically, container users won't be directly building or accessing the raw OCI components that form an image. However, these are frequently used as the underlying source of truth when inspecting container images with tools like `Docker`_ or `skopeo`_. As an example, the command ``docker inspect`` will, -in its majority, source the requested information from the image's OCI +in general, source the requested information from the image's OCI `configuration`_. On the other hand, the `OCI layers`_ are the literal filesystem contents that From 7d2128d132ac65031b63d90ded413ea1152f151e Mon Sep 17 00:00:00 2001 From: Cristovao Cordeiro Date: Wed, 16 Aug 2023 10:15:31 +0200 Subject: [PATCH 17/17] fix: sphinx linting --- docs/explanation/pebble.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/explanation/pebble.rst b/docs/explanation/pebble.rst index 2fb194627..956aa0a50 100644 --- a/docs/explanation/pebble.rst +++ b/docs/explanation/pebble.rst @@ -43,8 +43,8 @@ Pebble distinguishes itself from other similar tools (like `tini`_ and ROCKs as a single binary which acts both as a daemon and a client to itself; * **declarative service definition**: the Pebble service processes (or simply *Pebble services*) are declaratively defined in YAML files called layers. - Compared to `imperative wrapper scripts (as suggested in the Docker - documentation)`_, this provides a much cleaner and less error-prone way + Compared to `imperative wrapper scripts (as suggested in the Docker + documentation)`_, this provides a much cleaner and less error-prone way to define the processes that should run inside the container. * **services as first-class citizens**: unlike wrapper scripts, Pebble treats services as manageable units with a defined lifecycle and @@ -75,8 +75,8 @@ Creating services ~~~~~~~~~~~~~~~~~ Rockcraft follows the `Pebble layer specification`_ to the letter, with Pebble -services defined in :doc:`/reference/rockcraft.yaml`. -:doc:`/how-to/convert-to-pebble-layer` provides an example of how to +services defined in :doc:`/reference/rockcraft.yaml`. +:doc:`/how-to/convert-to-pebble-layer` provides an example of how to convert a Docker entrypoint to a Pebble layer.