aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/docker.h5
-rw-r--r--src/docker.c24
2 files changed, 26 insertions, 3 deletions
diff --git a/include/docker.h b/include/docker.h
index 3c7dff6..413bf6d 100644
--- a/include/docker.h
+++ b/include/docker.h
@@ -10,6 +10,9 @@
//! Flag for docker buildx
#define OMC_DOCKER_BUILD_X 1 << 2
+//! Compress "docker save"ed images with a compression program
+#define OMC_DOCKER_IMAGE_COMPRESSION "zstd"
+
struct DockerCapabilities {
int podman; //!< Is "docker" really podman?
int build; //!< Is a build plugin available?
@@ -79,6 +82,6 @@ int docker_exec(const char *args, unsigned flags);
*/
int docker_build(const char *dirpath, const char *args, int engine);
int docker_script(const char *image, char *data, unsigned flags);
-int docker_save(const char *image, const char *destdir);
+int docker_save(const char *image, const char *destdir, const char *compression_program);
#endif //OMC_DOCKER_H
diff --git a/src/docker.c b/src/docker.c
index 32c7b60..955428b 100644
--- a/src/docker.c
+++ b/src/docker.c
@@ -68,10 +68,30 @@ int docker_build(const char *dirpath, const char *args, int engine) {
return docker_exec(cmd, 0);
}
-int docker_save(const char *image, const char *destdir) {
+int docker_save(const char *image, const char *destdir, const char *compression_program) {
char cmd[PATH_MAX];
+
memset(cmd, 0, sizeof(cmd));
- sprintf(cmd, "save %s -o \"%s/%s.tar\"", image, destdir, image);
+
+ if (compression_program && strlen(compression_program)) {
+ char ext[255];
+ memset(ext, 0, sizeof(ext));
+ if (startswith(compression_program, "zstd")) {
+ strcpy(ext, "zst");
+ } else if (startswith(compression_program, "xz")) {
+ strcpy(ext, "xz");
+ } else if (startswith(compression_program, "gzip")) {
+ strcpy(ext, "gz");
+ } else if (startswith(compression_program, "bzip2")) {
+ strcpy(ext, "bz2");
+ } else {
+ strncpy(ext, compression_program, sizeof(ext) - 1);
+ }
+ sprintf(cmd, "save \"%s\" | %s > \"%s/%s.tar.%s\"", image, compression_program, destdir, image, ext);
+ } else {
+ sprintf(cmd, "save \"%s\" -o \"%s/%s.tar\"", image, destdir, image);
+
+ }
return docker_exec(cmd, 0);
}