All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH v1 0/2] Add support to generate OCI images
@ 2020-10-25  8:15 Sergio Prado
  2020-10-25  8:15 ` [Buildroot] [PATCH v1 1/2] package/sloci-image: new host package Sergio Prado
  2020-10-25  8:15 ` [Buildroot] [PATCH v1 2/2] oci: add new filesystem type Sergio Prado
  0 siblings, 2 replies; 3+ messages in thread
From: Sergio Prado @ 2020-10-25  8:15 UTC (permalink / raw)
  To: buildroot

From: Sergio Prado <sergio.prado@e-labworks.com>

This patch set adds support to OCI images.

The OCI image format is a specification for container images defined and
maintained as an open standard by the Open Container Initiative [1].

To generate the image according to the specification [2], a tool called
sloci-image is used.

[1] https://opencontainers.org/
[2] https://github.com/opencontainers/image-spec/blob/master/spec.md

The generated container images were tested on x86_64, arm and aarch64.

Sergio Prado (2):
  package/sloci-image: new host package
  oci: add new filesystem type

 DEVELOPERS                                    |  1 +
 fs/Config.in                                  |  1 +
 fs/oci/Config.in                              | 88 +++++++++++++++++
 fs/oci/oci.mk                                 | 97 +++++++++++++++++++
 package/Config.in.host                        |  1 +
 ...ues-when-generating-the-OCI-image-co.patch | 55 +++++++++++
 package/sloci-image/Config.in.host            |  7 ++
 package/sloci-image/sloci-image.hash          |  5 +
 package/sloci-image/sloci-image.mk            | 19 ++++
 9 files changed, 274 insertions(+)
 create mode 100644 fs/oci/Config.in
 create mode 100644 fs/oci/oci.mk
 create mode 100644 package/sloci-image/0001-Fix-escaping-issues-when-generating-the-OCI-image-co.patch
 create mode 100644 package/sloci-image/Config.in.host
 create mode 100644 package/sloci-image/sloci-image.hash
 create mode 100644 package/sloci-image/sloci-image.mk

-- 
2.17.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Buildroot] [PATCH v1 1/2] package/sloci-image: new host package
  2020-10-25  8:15 [Buildroot] [PATCH v1 0/2] Add support to generate OCI images Sergio Prado
@ 2020-10-25  8:15 ` Sergio Prado
  2020-10-25  8:15 ` [Buildroot] [PATCH v1 2/2] oci: add new filesystem type Sergio Prado
  1 sibling, 0 replies; 3+ messages in thread
From: Sergio Prado @ 2020-10-25  8:15 UTC (permalink / raw)
  To: buildroot

From: Sergio Prado <sergio.prado@e-labworks.com>

sloci-image is a simple CLI tool for packing rootfs into a single-layer
OCI image.

The patch fixes a escaping issue and a PR was sent upstream:

https://github.com/jirutka/sloci-image/pull/2

Signed-off-by: Sergio Prado <sergio.prado@e-labworks.com>
---
 DEVELOPERS                                    |  1 +
 package/Config.in.host                        |  1 +
 ...ues-when-generating-the-OCI-image-co.patch | 55 +++++++++++++++++++
 package/sloci-image/Config.in.host            |  7 +++
 package/sloci-image/sloci-image.hash          |  5 ++
 package/sloci-image/sloci-image.mk            | 19 +++++++
 6 files changed, 88 insertions(+)
 create mode 100644 package/sloci-image/0001-Fix-escaping-issues-when-generating-the-OCI-image-co.patch
 create mode 100644 package/sloci-image/Config.in.host
 create mode 100644 package/sloci-image/sloci-image.hash
 create mode 100644 package/sloci-image/sloci-image.mk

diff --git a/DEVELOPERS b/DEVELOPERS
index b245c1cd7eee..a0bfde2391a6 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2383,6 +2383,7 @@ F:	package/curlpp/
 F:	package/daq/
 F:	package/libgdiplus/
 F:	package/pimd/
+F:	package/sloci-image/
 F:	package/snort/
 F:	package/stella/
 F:	package/tio/
diff --git a/package/Config.in.host b/package/Config.in.host
index 546f1c226dec..26ed8480cc21 100644
--- a/package/Config.in.host
+++ b/package/Config.in.host
@@ -76,6 +76,7 @@ menu "Host utilities"
 	source "package/sam-ba/Config.in.host"
 	source "package/sdbusplus/Config.in.host"
 	source "package/sentry-cli/Config.in.host"
+	source "package/sloci-image/Config.in.host"
 	source "package/squashfs/Config.in.host"
 	source "package/sunxi-tools/Config.in.host"
 	source "package/swig/Config.in.host"
diff --git a/package/sloci-image/0001-Fix-escaping-issues-when-generating-the-OCI-image-co.patch b/package/sloci-image/0001-Fix-escaping-issues-when-generating-the-OCI-image-co.patch
new file mode 100644
index 000000000000..de95cda38717
--- /dev/null
+++ b/package/sloci-image/0001-Fix-escaping-issues-when-generating-the-OCI-image-co.patch
@@ -0,0 +1,55 @@
+From f2ebd0aaff7c519fd3d1c64bdfbedb49b6c60c11 Mon Sep 17 00:00:00 2001
+From: Sergio Prado <sergio.prado@e-labworks.com>
+Date: Sat, 24 Oct 2020 12:43:46 -0300
+Subject: [PATCH] Fix escaping issues when generating the OCI image config
+ files
+
+Some parameters are not escaping correctly the double quotes
+when generating the OCI image config files.
+
+This is easily reproducible:
+
+$ mkdir rootfs
+$ ./sloci-image --arch arm --user 0 rootfs oci-image:latest
+$ grep -R "User" oci-image/
+oci-image/blobs/sha256/e574ac66b91453b00beb37717ed0e604249fa695ec772e17a56ff208357ec72a:    \"User\": "0",
+
+Fix that by escaping the double quotes with an echo command.
+
+Signed-off-by: Sergio Prado <sergio.prado@e-labworks.com>
+---
+ sloci-image | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sloci-image b/sloci-image
+index be8e79a824e0..2c7ab5047271 100755
+--- a/sloci-image
++++ b/sloci-image
+@@ -269,13 +269,13 @@ oci_image_config() {
+ 	  "architecture": "$(oci_arch $CFG_ARCH)",
+ 	  "os": "$CFG_OS",
+ 	  "config": {
+-	    ${CFG_USER:+"\"User\": $(json_string "$CFG_USER"),"}
++	    ${CFG_USER:+"$(echo \"User\"): $(json_string "$CFG_USER"),"}
+ 	    "ExposedPorts": $(json_pseudoarray "$CFG_PORTS"),
+ 	    "Env": $(json_string_array "$CFG_ENV"),
+ 	    "Entrypoint": $(json_string_array "$CFG_ENTRYPOINT"),
+ 	    "Cmd": $(json_string_array "$CFG_CMD"),
+ 	    "Volumes": $(json_pseudoarray "$CFG_VOLUMES"),
+-	    ${CFG_WORKING_DIR:+"\"WorkingDir\": $(json_string "$CFG_WORKING_DIR"),"}
++	    ${CFG_WORKING_DIR:+"$(echo \"WorkingDir\"): $(json_string "$CFG_WORKING_DIR"),"}
+ 	    "Labels": $(json_string_map "$CFG_LABELS")
+ 	  },
+ 	  "rootfs": {
+@@ -309,7 +309,7 @@ oci_image_index() {
+ 	      "digest": "$manifest_digest",
+ 	      "platform": {
+ 	        "architecture": "$(oci_arch $CFG_ARCH)",
+-	        ${CFG_ARCH_VARIANT:+"\"variant\": $(json_string "$CFG_ARCH_VARIANT"),"}
++	        ${CFG_ARCH_VARIANT:+"$(echo \"variant\"): $(json_string "$CFG_ARCH_VARIANT"),"}
+ 	        "os": "$CFG_OS"
+ 	      },
+ 	      "annotations": {
+-- 
+2.17.1
+
diff --git a/package/sloci-image/Config.in.host b/package/sloci-image/Config.in.host
new file mode 100644
index 000000000000..d809f1f3c786
--- /dev/null
+++ b/package/sloci-image/Config.in.host
@@ -0,0 +1,7 @@
+config BR2_PACKAGE_HOST_SLOCI_IMAGE
+	bool "host sloci-image"
+	help
+	  A simple CLI tool for packing rootfs into a single-layer OCI
+	  image.
+
+	  https://github.com/jirutka/sloci-image
diff --git a/package/sloci-image/sloci-image.hash b/package/sloci-image/sloci-image.hash
new file mode 100644
index 000000000000..2476b2340823
--- /dev/null
+++ b/package/sloci-image/sloci-image.hash
@@ -0,0 +1,5 @@
+# Locally computed
+sha256  2c154e355aea65089921058c8ba96cc90e6c22753b4e7956221403b6183ac775  sloci-image-4015e49763e5a738026a5bbfcf32b38b5a4fa650.tar.gz
+
+# Hash for license files:
+sha256  8ea53673b084576813fc40cd63817c5a1619438942b5e6c30dac1d10707c27e4  LICENSE
diff --git a/package/sloci-image/sloci-image.mk b/package/sloci-image/sloci-image.mk
new file mode 100644
index 000000000000..ab716a074342
--- /dev/null
+++ b/package/sloci-image/sloci-image.mk
@@ -0,0 +1,19 @@
+################################################################################
+#
+# sloci-image
+#
+################################################################################
+
+SLOCI_IMAGE_VERSION = 4015e49763e5a738026a5bbfcf32b38b5a4fa650
+SLOCI_IMAGE_SITE = $(call github,jirutka,sloci-image,$(SLOCI_IMAGE_VERSION))
+
+SLOCI_IMAGE_LICENSE = MIT
+SLOCI_IMAGE_LICENSE_FILES = LICENSE
+
+HOST_SLOCI_IMAGE_DEPENDENCIES = host-gawk
+
+define HOST_SLOCI_IMAGE_INSTALL_CMDS
+	$(HOST_MAKE_ENV) $(MAKE) DESTDIR=$(HOST_DIR) PREFIX=/usr -C $(@D) install
+endef
+
+$(eval $(host-generic-package))
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [Buildroot] [PATCH v1 2/2] oci: add new filesystem type
  2020-10-25  8:15 [Buildroot] [PATCH v1 0/2] Add support to generate OCI images Sergio Prado
  2020-10-25  8:15 ` [Buildroot] [PATCH v1 1/2] package/sloci-image: new host package Sergio Prado
@ 2020-10-25  8:15 ` Sergio Prado
  1 sibling, 0 replies; 3+ messages in thread
From: Sergio Prado @ 2020-10-25  8:15 UTC (permalink / raw)
  To: buildroot

From: Sergio Prado <sergio.prado@e-labworks.com>

Add support to generate OCI (Open Container Initiative) images.

An OCI image consists of a manifest, an image index (optional), a set of
filesystem layers, and a configuration. The complete specification is
available in the link below:

https://github.com/opencontainers/image-spec/blob/master/spec.md

The image is generated with the host tool sloci-image, and config
options can be used to configure image parameters.

By default, the image is generated in a directory called rootfs-oci:

$ cd output/images
$ ls rootfs-oci/
blobs  index.json  oci-layout

Optionally, the image can be packed into a tar archive.

The image can be pushed to a registry using containers tools like
skopeo:

$ skopeo copy --dest-creds <user>:<pass> oci:rootfs-oci:<tag> \
	docker://<user>/<image>

And then we can pull/run the container image with tools like docker:

$ docker run -it <user>/<image>:<tag>

Signed-off-by: Sergio Prado <sergio.prado@e-labworks.com>
---
 fs/Config.in     |  1 +
 fs/oci/Config.in | 88 +++++++++++++++++++++++++++++++++++++++++++
 fs/oci/oci.mk    | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 186 insertions(+)
 create mode 100644 fs/oci/Config.in
 create mode 100644 fs/oci/oci.mk

diff --git a/fs/Config.in b/fs/Config.in
index 37a2aa21f8ac..eee5e26bb2b3 100644
--- a/fs/Config.in
+++ b/fs/Config.in
@@ -11,6 +11,7 @@ source "fs/f2fs/Config.in"
 source "fs/initramfs/Config.in"
 source "fs/iso9660/Config.in"
 source "fs/jffs2/Config.in"
+source "fs/oci/Config.in"
 source "fs/romfs/Config.in"
 source "fs/squashfs/Config.in"
 source "fs/tar/Config.in"
diff --git a/fs/oci/Config.in b/fs/oci/Config.in
new file mode 100644
index 000000000000..b17e7009e9e5
--- /dev/null
+++ b/fs/oci/Config.in
@@ -0,0 +1,88 @@
+config BR2_TARGET_ROOTFS_OCI
+	bool "oci image"
+	help
+	  Build an OCI (Open Container Initiative) image.
+
+	  By default, the image is generated in a directory called
+	  rootfs-oci:
+
+	  $ cd output/images
+	  $ ls rootfs-oci/
+	  blobs  index.json  oci-layout
+
+	  You can push the image to a registry. Example using skopeo:
+
+	  $ skopeo copy --dest-creds <user>:<pass> \
+	          oci:rootfs-oci:<tag> docker://<user>/<image>
+
+	  And pull/run it with docker:
+
+	  $ docker run -it <user>/<image>:<tag>
+
+if BR2_TARGET_ROOTFS_OCI
+
+config BR2_TARGET_ROOTFS_OCI_AUTHOR
+	string "author name and/or email address"
+	default "Buildroot"
+	help
+	  Name and/or email address of the person which created the
+	  image.
+
+config BR2_TARGET_ROOTFS_OCI_TAG
+	string "image tag"
+	default "latest"
+	help
+	  Tag to be used in the container image. If empty, 'latest' will
+	  be used by default.
+
+config BR2_TARGET_ROOTFS_OCI_ENTRYPOINT
+	string "entrypoint"
+	default "sh"
+	help
+	  Command to execute when the container starts.
+
+config BR2_TARGET_ROOTFS_OCI_ENTRYPOINT_ARGS
+	string "entrypoint arguments"
+	help
+	  Default arguments to the entrypoint of the container.
+
+config BR2_TARGET_ROOTFS_OCI_WORKDIR
+	string "working directory"
+	help
+	  Working directory of the entrypoint process in the
+	  container.
+
+config BR2_TARGET_ROOTFS_OCI_UID
+	string "username or UID"
+	default "0"
+	help
+	  The username or UID of user the process run as.
+
+config BR2_TARGET_ROOTFS_OCI_ENV_VARS
+	string "environment variables"
+	help
+	  Default environment variables for the container.
+
+config BR2_TARGET_ROOTFS_OCI_PORTS
+	string "ports"
+	help
+	  Default set of ports to expose from a container running
+	  this image in the following format:
+
+	  <port>/tcp, <port>/udp, <port> (same as <port>/tcp).
+
+config BR2_TARGET_ROOTFS_OCI_LABELS
+	string "labels"
+	help
+	  Metadata in the format KEY=VALUE for the container compliant
+	  with OCI annotation rules. If KEY starts with a dot, it will
+	  be prefixed with "org.opencontainers.image"
+	  (e.g. .url -> org.opencontainers.image.url).
+
+config BR2_TARGET_ROOTFS_OCI_ARCHIVE
+	bool "pack oci image into a tar archive"
+	default n
+	help
+	  Select whether the image should be packed into a TAR archive.
+
+endif
diff --git a/fs/oci/oci.mk b/fs/oci/oci.mk
new file mode 100644
index 000000000000..9656ad3c0312
--- /dev/null
+++ b/fs/oci/oci.mk
@@ -0,0 +1,97 @@
+################################################################################
+#
+# Build the oci image
+#
+################################################################################
+
+ROOTFS_OCI_IMAGE_NAME = rootfs-oci
+
+ROOTFS_OCI_DEPENDENCIES = host-sloci-image
+
+# architecture
+SLOCI_IMAGE_OPTS = --arch $(BR2_ARCH)
+
+# architecture variant (typically used only for arm)
+ifeq ($(BR2_ARM_CPU_HAS_ARM),y)
+ifeq ($(BR2_ARM_CPU_ARMV5),y)
+SLOCI_IMAGE_OPTS += --arch-variant v5
+else ifeq ($(BR2_ARM_CPU_ARMV6),y)
+SLOCI_IMAGE_OPTS += --arch-variant v6
+else ifeq ($(BR2_ARM_CPU_ARMV7A),y)
+SLOCI_IMAGE_OPTS += --arch-variant v7
+else ifeq ($(BR2_ARM_CPU_ARMV8A),y)
+SLOCI_IMAGE_OPTS += --arch-variant v8
+endif
+endif
+
+# entrypoint
+OCI_ENTRYPOINT = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_ENTRYPOINT))
+ifneq ($(OCI_ENTRYPOINT),)
+SLOCI_IMAGE_OPTS += --entrypoint $(OCI_ENTRYPOINT)
+endif
+
+# entrypoint arguments
+OCI_ENTRYPOINT_ARGS = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_ENTRYPOINT_ARGS))
+ifneq ($(OCI_ENTRYPOINT_ARGS),)
+SLOCI_IMAGE_OPTS += --cmd "$(OCI_ENTRYPOINT_ARGS)"
+endif
+
+# author
+OCI_AUTHOR = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_AUTHOR))
+ifneq ($(OCI_AUTHOR),)
+SLOCI_IMAGE_OPTS += --author "$(OCI_AUTHOR)"
+endif
+
+# username or UID
+OCI_UID = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_UID))
+ifneq ($(OCI_UID),)
+SLOCI_IMAGE_OPTS += --user $(OCI_UID)
+endif
+
+# labels
+OCI_LABELS = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_LABELS))
+ifneq ($(OCI_LABELS),)
+SLOCI_IMAGE_OPTS += \
+	$(foreach label,$(OCI_LABELS),--label $(label))
+endif
+
+# environment variables
+OCI_ENV_VARS = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_ENV_VARS))
+ifneq ($(OCI_ENV_VARS),)
+SLOCI_IMAGE_OPTS += \
+	$(foreach var,$(OCI_ENV_VARS),--env $(var))
+endif
+
+# working directory
+OCI_WORKDIR = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_WORKDIR))
+ifneq ($(OCI_WORKDIR),)
+SLOCI_IMAGE_OPTS += --working-dir $(OCI_WORKDIR)
+endif
+
+# ports
+OCI_PORTS = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_PORTS))
+ifneq ($(OCI_PORTS),)
+SLOCI_IMAGE_OPTS += \
+	$(foreach port,$(OCI_PORTS),--port $(port))
+endif
+
+# tag
+OCI_TAG = $(call qstrip,$(BR2_TARGET_ROOTFS_OCI_TAG))
+ifeq ($(OCI_TAG),)
+OCI_TAG = latest
+endif
+
+# enable tar archive
+ifeq ($(BR2_TARGET_ROOTFS_OCI_ARCHIVE),y)
+SLOCI_IMAGE_OPTS += --tar
+endif
+
+define ROOTFS_OCI_CMD
+	(cd $(BINARIES_DIR); \
+		rm -rf $(ROOTFS_OCI_IMAGE_NAME)*
+		$(HOST_DIR)/bin/sloci-image $(SLOCI_IMAGE_OPTS) $(TARGET_DIR) \
+			$(ROOTFS_OCI_IMAGE_NAME):$(OCI_TAG)
+	)
+endef
+
+$(eval $(rootfs))
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-25  8:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-25  8:15 [Buildroot] [PATCH v1 0/2] Add support to generate OCI images Sergio Prado
2020-10-25  8:15 ` [Buildroot] [PATCH v1 1/2] package/sloci-image: new host package Sergio Prado
2020-10-25  8:15 ` [Buildroot] [PATCH v1 2/2] oci: add new filesystem type Sergio Prado

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.