Skip to content

Commit

Permalink
Merge pull request #21 from willglynn/multistage_build
Browse files Browse the repository at this point in the history
Switch to a multi-stage build process
  • Loading branch information
nahiluhmot committed Feb 26, 2018
2 parents 73741a1 + 2dfef39 commit 74fc0df
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 57 deletions.
27 changes: 27 additions & 0 deletions Dockerfile
@@ -0,0 +1,27 @@
FROM golang:1-alpine AS builder

RUN apk add --no-cache curl

# Make a /target directory which we'll copy into the target image as a single layer, and
# populate it with some SSL roots
RUN mkdir -p /target/etc/ssl/certs && \
curl -s -o /target/etc/ssl/certs/ca-certificates.crt https://curl.haxx.se/ca/cacert.pem

# Copy in the app
ENV CGO_ENABLED=0
WORKDIR /go/src/github.com/swipely/iam-docker/
ADD . .

# Run tests
RUN go test -v ./...

# Build the app via `go install`, copy the binary to /target/iam-docker, and copy the license file
RUN go install ./... && \
cp /go/bin/src /target/iam-docker && \
cp LICENSE /target/

# Build the final image
FROM scratch
MAINTAINER Tom Hulihan (hulihan.tom159@gmail.com)
COPY --from=builder /target /
ENTRYPOINT ["/iam-docker"]
5 changes: 0 additions & 5 deletions Dockerfile.build

This file was deleted.

7 changes: 0 additions & 7 deletions Dockerfile.release

This file was deleted.

52 changes: 8 additions & 44 deletions Makefile
Expand Up @@ -5,69 +5,33 @@ SRC=$(SRCDIR)/...
SRCS=$(SRCDIR)/**/*.go
MAIN=$(SRCDIR)/main.go
TEST_OPTS=-v
DIST=./dist
EXE_NAME=iam-docker
EXE=$(DIST)/$(EXE_NAME)
CACERT=$(DIST)/ca-certificates.crt
CACERT_SRC=https://curl.haxx.se/ca/cacert.pem
VERSION_FILE=VERSION
VERSION=$(shell cat $(VERSION_FILE))
DOCKER=docker
DOCKER_BUILD_IMAGE_NAME=swipely/iam-docker-build
DOCKER_RELEASE_IMAGE_NAME=swipely/iam-docker
DOCKER_IMAGE_NAME=swipely/iam-docker
DOCKER_TAG=$(VERSION)
DOCKER_BUILD_IMAGE=$(DOCKER_BUILD_IMAGE_NAME):$(DOCKER_TAG)
DOCKER_RELEASE_IMAGE=$(DOCKER_RELEASE_IMAGE_NAME):$(DOCKER_TAG)
DOCKER_RELEASE_IMAGE_LATEST=$(DOCKER_RELEASE_IMAGE_NAME):latest
DOCKER_BUILD_EXE=/go/src/github.com/swipely/iam-docker/dist/iam-docker
BUILD_DOCKERFILE=Dockerfile.build
RELEASE_DOCKERFILE=Dockerfile.release
DOCKER_IMAGE=$(DOCKER_IMAGE_NAME):$(DOCKER_TAG)
DOCKER_IMAGE_LATEST=$(DOCKER_RELEASE_IMAGE_NAME):latest

default: test

clean:
rm -rf $(DIST)

build:
$(GO) build $(SRC)

test:
$(GO) test $(TEST_OPTS) $(SRC)

exe: $(EXE)

get-deps:
go get -u github.com/tools/godep

test-in-docker: docker-build
$(DOCKER) run $(DOCKER_BUILD_IMAGE) make test

release: docker
git tag $(VERSION)
git push origin --tags
docker push $(DOCKER_RELEASE_IMAGE)
docker push $(DOCKER_RELEASE_IMAGE_LATEST)

docker: docker-build $(CACERT)
$(eval CONTAINER := $(shell $(DOCKER) create $(DOCKER_BUILD_IMAGE) make exe))
$(DOCKER) start $(CONTAINER)
$(DOCKER) logs -f $(CONTAINER)
mkdir -p $(DIST)
$(DOCKER) cp $(CONTAINER):$(DOCKER_BUILD_EXE) $(EXE)
$(DOCKER) rm -f $(CONTAINER)
$(DOCKER) build -t $(DOCKER_RELEASE_IMAGE) -f $(RELEASE_DOCKERFILE) .
$(DOCKER) tag $(DOCKER_RELEASE_IMAGE) $(DOCKER_RELEASE_IMAGE_LATEST)

docker-build: $(SRCS)
$(DOCKER) build -t $(DOCKER_BUILD_IMAGE) -f $(BUILD_DOCKERFILE) .

$(CACERT): $(DIST)
curl -s $(CACERT_SRC) > $(CACERT)

$(EXE): $(DIST) $(SRCS)
$(GO) build $(GO_BUILD_OPTS) -o $(EXE) $(MAIN)
docker push $(DOCKER_IMAGE)
docker push $(DOCKER_IMAGE_LATEST)

$(DIST):
mkdir -p $(DIST)
docker: $(SRCS) Dockerfile
$(DOCKER) build -t $(DOCKER_IMAGE) .

.PHONY: build clean default docker docker-build exe get-deps release test test-in-docker
.PHONY: build default docker get-deps release test
1 change: 0 additions & 1 deletion README.md
Expand Up @@ -95,6 +95,5 @@ Commonly used commands:
* `make get-deps` - install the system dependencies
* `make test` - run the application tests
* `make docker` - build a release Docker image
* `make test-in-docker` - run the tests in Docker

All source code is in the `src/` directory.

0 comments on commit 74fc0df

Please sign in to comment.