diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-03-06 12:53:26 -0500 | 
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-03-06 12:53:37 -0500 | 
| commit | e678623a8b01c0a24c601c1fb7fa588f14e2dc0e (patch) | |
| tree | 90845cb361dc8a7c4d586f75987a287cb37b0234 | |
| parent | 9bb22e9fc9be18ee4829a2e672ea05889dcbb224 (diff) | |
| download | stasis-e678623a8b01c0a24c601c1fb7fa588f14e2dc0e.tar.gz | |
docker_save function will pipe output of "docker save" to a compression program if requested
| -rw-r--r-- | include/docker.h | 5 | ||||
| -rw-r--r-- | src/docker.c | 24 | 
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);  } | 
