Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| da1fb2ae17 | |||
| 8a2713bd3b | |||
| 5b65b37d81 | |||
| d806f056f3 | |||
| ec89ce64bd | |||
| 91b3730f0c | |||
| db45af6b9d | |||
|
|
f0bebff6a1 | ||
|
|
e6d1a95c02 |
4
Makefile
4
Makefile
@@ -1,4 +1,4 @@
|
||||
SCRIPTS = $(shell awk '/#!\/bin\/(ba)?sh/&&FNR==1{print FILENAME}' $(shell git ls-files))
|
||||
SCRIPTS = $(shell awk '/#!\/usr\/bin\/env (ba)?sh/&&FNR==1{print FILENAME}' $(shell git ls-files))
|
||||
GODEPS = $(shell git ls-files '*.go' go.mod go.sum)
|
||||
|
||||
VSN ?= $(shell git describe --dirty)
|
||||
@@ -14,7 +14,7 @@ test: coverage.out
|
||||
.PHONY: lint
|
||||
lint:
|
||||
go vet ./...
|
||||
$(shell go env GOPATH)/bin/staticcheck -f stylish ./...
|
||||
staticcheck -f stylish ./...
|
||||
shellcheck $(SCRIPTS)
|
||||
|
||||
.INTERMEDIATE: coverage.out
|
||||
|
||||
16
README.md
16
README.md
@@ -5,6 +5,15 @@ Undocker
|
||||
|
||||
Converts a Docker image (a bunch of layers) to a flattened "rootfs" tarball.
|
||||
|
||||
Project Status
|
||||
--------------
|
||||
|
||||
The project was announced to be deprecated in the beginning of 2024, but the
|
||||
maintainer has an interest in Docker ecosystem again, thus will maintain it
|
||||
somewhat starting at mid-2024.
|
||||
|
||||
The author has some significant changes in mind, but the timeline is unknown.
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
@@ -79,13 +88,6 @@ Similar Projects
|
||||
|
||||
* [rootfs_builder](https://github.com/ForAllSecure/rootfs_builder)
|
||||
|
||||
Changelog
|
||||
---------
|
||||
|
||||
**v1.0**
|
||||
|
||||
* initial release: `rootfs.Flatten` and a simple command-line application.
|
||||
|
||||
Contributions
|
||||
-------------
|
||||
|
||||
|
||||
13
main.go
13
main.go
@@ -2,6 +2,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@@ -42,7 +43,7 @@ func main() {
|
||||
|
||||
c := &command{flattener: rootfs.Flatten, Stdout: os.Stdout}
|
||||
if err := c.execute(os.Args[1], os.Args[2]); err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
os.Exit(0)
|
||||
@@ -59,10 +60,7 @@ func (c *command) execute(infile string, outfile string) (_err error) {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
err := rd.Close()
|
||||
if _err == nil {
|
||||
_err = err
|
||||
}
|
||||
_err = errors.Join(_err, rd.Close())
|
||||
}()
|
||||
|
||||
var out io.Writer
|
||||
@@ -74,11 +72,10 @@ func (c *command) execute(infile string, outfile string) (_err error) {
|
||||
return fmt.Errorf("create: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
err := outf.Close()
|
||||
if _err != nil {
|
||||
os.Remove(outfile)
|
||||
_err = errors.Join(_err, os.Remove(outfile))
|
||||
} else {
|
||||
_err = err
|
||||
_err = errors.Join(_err, outf.Close())
|
||||
}
|
||||
}()
|
||||
out = outf
|
||||
|
||||
4
release
4
release
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
_err(){ >&2 echo "ERROR: $*"; exit 1; }
|
||||
@@ -22,4 +22,4 @@ last_tag=$(git tag | tail -1)
|
||||
echo
|
||||
echo Changelog since "$last_tag":
|
||||
git log --pretty=format:"- [%an] %s" "$last_tag"..HEAD
|
||||
} | git tag -u motiejus@jakstys.lt -F - "$1"
|
||||
} | git tag -F - "$1"
|
||||
|
||||
@@ -144,11 +144,7 @@ func Flatten(rd io.ReadSeeker, w io.Writer) (_err error) {
|
||||
|
||||
tw := tar.NewWriter(w)
|
||||
defer func() {
|
||||
// Avoiding use of multierr: if error is present, return
|
||||
// that. Otherwise return whatever `Close` returns.
|
||||
if err := tw.Close(); err != nil && _err == nil {
|
||||
_err = err
|
||||
}
|
||||
_err = errors.Join(_err, tw.Close())
|
||||
}()
|
||||
// iterate through all layers, all files, and write files.
|
||||
for i, no := range layers {
|
||||
|
||||
Reference in New Issue
Block a user