dockerfile: move image frontend to this repo until api stabilizes
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>docker-18.09
parent
80bc5f6097
commit
96d39a8ba8
|
@ -0,0 +1,7 @@
|
|||
FROM golang:1.8-alpine AS builder
|
||||
COPY . /go/src/github.com/moby/buildkit
|
||||
RUN CGO_ENABLED=0 go build -o /dockerfile-frontend --ldflags '-extldflags "-static"' github.com/moby/buildkit/frontend/dockerfile/cmd/dockerfile-frontend
|
||||
|
||||
FROM scratch
|
||||
COPY --from=builder /dockerfile-frontend /bin/dockerfile-frontend
|
||||
ENTRYPOINT ["/bin/dockerfile-frontend"]
|
|
@ -0,0 +1,107 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/moby/buildkit/client/llb"
|
||||
"github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb"
|
||||
"github.com/moby/buildkit/frontend/gateway/client"
|
||||
"github.com/moby/buildkit/util/appcontext"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
const (
|
||||
keyTarget = "target"
|
||||
keyFilename = "filename"
|
||||
exporterImageConfig = "containerimage.config"
|
||||
defaultDockerfileName = "Dockerfile"
|
||||
localNameDockerfile = "dockerfile"
|
||||
buildArgPrefix = "build-arg:"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := run(); err != nil {
|
||||
logrus.Errorf("fatal error: %+v", err)
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func run() error {
|
||||
c, err := client.Current()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to create client")
|
||||
}
|
||||
|
||||
ctx := appcontext.Context()
|
||||
|
||||
opts := c.Opts()
|
||||
|
||||
filename := opts[keyFilename]
|
||||
if filename == "" {
|
||||
filename = defaultDockerfileName
|
||||
}
|
||||
if path.Base(filename) != filename {
|
||||
return errors.Errorf("invalid filename: %s", filename)
|
||||
}
|
||||
|
||||
src := llb.Local(localNameDockerfile,
|
||||
llb.IncludePatterns([]string{filename}),
|
||||
llb.SessionID(c.SessionID()),
|
||||
)
|
||||
def, err := src.Marshal()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ref, err := c.Solve(ctx, def.ToPB(), "", nil, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dtDockerfile, err := ref.ReadFile(ctx, filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
st, img, err := dockerfile2llb.Dockerfile2LLB(ctx, dtDockerfile, dockerfile2llb.ConvertOpt{
|
||||
Target: opts[keyTarget],
|
||||
MetaResolver: c,
|
||||
BuildArgs: filterBuildArgs(opts),
|
||||
SessionID: c.SessionID(),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
def, err = st.Marshal()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
config, err := json.Marshal(img)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = c.Solve(ctx, def.ToPB(), "", map[string][]byte{
|
||||
exporterImageConfig: config,
|
||||
}, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func filterBuildArgs(opt map[string]string) map[string]string {
|
||||
m := map[string]string{}
|
||||
for k, v := range opt {
|
||||
if strings.HasPrefix(k, buildArgPrefix) {
|
||||
m[strings.TrimPrefix(k, buildArgPrefix)] = v
|
||||
}
|
||||
}
|
||||
return m
|
||||
}
|
Loading…
Reference in New Issue