Skip to content

Commit 069ab25

Browse files
straight-shootaBrian J. Cardiff
authored andcommitted
Add alpine.Dockerfile and refactor docker Makefile (#29)
* Add alpine.Dockerfile and refactor docker Makefile * Build libcrystal and libgc * Revert "Build libcrystal and libgc" This reverts commit 615073b. * Update alpine dockerfile to build deps * Build only libcrystal without Makefile and LLVM * fixup! Build only libcrystal without Makefile and LLVM * Fix Makefile * Fix put Dockerfile in build context * Simplify and fix build recipies * alpine.Dockerfile: Add g++ as dependency Required for building llvm_ext
1 parent 6e8201b commit 069ab25

File tree

4 files changed

+138
-27
lines changed

4 files changed

+138
-27
lines changed

docker/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build-context/

docker/Makefile

Lines changed: 99 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,115 @@
1+
# Recipies for this Makefile
2+
3+
## Build all docker images
4+
## $ make DOCKER_REPOSITORY=crystal-lang/crystal DOCKER_TAG=nightly CRYSTAL_VERSION=0.xy.z CRYSTAL_DEB=... CRYSTAL_TARGZ=...
5+
## Build ubuntu64 docker images
6+
## $ make ubuntu64 DOCKER_REPOSITORY=crystal-lang/crystal DOCKER_TAG=nightly CRYSTAL_VERSION=0.xy.z CRYSTAL_DEB=...
7+
## Build alpine docker images
8+
## $ make alpine DOCKER_REPOSITORY=crystal-lang/crystal DOCKER_TAG=nightly CRYSTAL_VERSION=0.xy.z CRYSTAL_TARGZ=...
9+
110
CRYSTAL_VERSION ?= ## How the binaries should be branded
2-
CRYSTAL_DEB ?= ## which crystal.deb file to install in the docker images
3-
DOCKER_TAG ?= ## How to tag the docker image. a -build will be appended for -build image
11+
CRYSTAL_DEB ?= ## Which crystal.deb file to install in debian based docker images (ubuntu)
12+
CRYSTAL_TARGZ ?= ## Which crystal.tar.gz file to install in docker images (alpine)
13+
DOCKER_TAG ?= ## How to tag the docker image (examples: `0.27.2`, `nightly20190307`). `-build` will be appended for build images.
414
DOCKER_REPOSITORY ?= ## Docker hub repository to commit image
515

6-
OUTPUT_DIR = build
7-
BUILD_ARGS64 = --build-arg crystal_deb=./tmp/crystal.deb --build-arg base_docker_image=ubuntu:bionic
8-
BUILD_ARGS32 = --build-arg crystal_deb=./tmp/crystal.deb --build-arg base_docker_image=i386/ubuntu:bionic
16+
OUTPUT_DIR := build
17+
BUILD_CONTEXT := $(CURDIR)/build-context
18+
BUILD_ARGS_UBUNTU64 := --build-arg crystal_deb=crystal.deb $(BUILD_CONTEXT)/ubuntu64 --build-arg base_docker_image=ubuntu:bionic
19+
BUILD_ARGS_UBUNTU32 := --build-arg crystal_deb=crystal.deb $(BUILD_CONTEXT)/ubuntu32 --build-arg base_docker_image=i386/ubuntu:bionic
20+
BUILD_ARGS_ALPINE := --build-arg crystal_targz=crystal.tar.gz $(BUILD_CONTEXT)/alpine
21+
DOCKER_TAG_UBUNTU := $(DOCKER_REPOSITORY):$(DOCKER_TAG)
22+
DOCKER_TAG_ALPINE := $(DOCKER_REPOSITORY):$(DOCKER_TAG)-alpine
923

1024
.PHONY: all64
11-
all64: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION).tar.gz $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-build.tar.gz
25+
all64: ubuntu64 alpine ## Build all x86_64 images
1226

1327
.PHONY: all32
14-
all32: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386.tar.gz $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386-build.tar.gz
28+
all32: ubuntu32 ## Build all i386 images
1529

16-
$(CURDIR)/tmp/crystal.deb:
17-
mkdir -p $(CURDIR)/tmp
18-
cp $(CRYSTAL_DEB) $(CURDIR)/tmp/crystal.deb
30+
.PHONY: all_ubuntu
31+
all_ubuntu: ubuntu64 ubuntu32 ## Build all ubuntu images
1932

20-
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION).tar.gz: $(CURDIR)/tmp/crystal.deb
21-
mkdir -p $(OUTPUT_DIR)
22-
docker build $(BUILD_ARGS64) --target runtime -t $(DOCKER_REPOSITORY):$(DOCKER_TAG) .
23-
docker save $(DOCKER_REPOSITORY):$(DOCKER_TAG) | gzip > $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION).tar.gz
33+
.PHONY: ubuntu64
34+
ubuntu64: ## Build ubuntu x86_64 images
35+
ubuntu64: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-x86_64.tar.gz
36+
ubuntu64: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-x86_64-build.tar.gz
2437

25-
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-build.tar.gz: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION).tar.gz
26-
mkdir -p $(OUTPUT_DIR)
27-
docker build $(BUILD_ARGS64) --target build -t $(DOCKER_REPOSITORY):$(DOCKER_TAG)-build .
28-
docker save $(DOCKER_REPOSITORY):$(DOCKER_TAG)-build | gzip > $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-build.tar.gz
38+
.PHONY: ubuntu32
39+
ubuntu32: ## Build ubuntu i386 images
40+
ubuntu32: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-i386.tar.gz
41+
ubuntu32: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-i386-build.tar.gz
2942

30-
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386.tar.gz: $(CURDIR)/tmp/crystal.deb
31-
mkdir -p $(OUTPUT_DIR)
32-
docker build $(BUILD_ARGS32) --target runtime -t $(DOCKER_REPOSITORY):$(DOCKER_TAG)-i386 .
33-
docker save $(DOCKER_REPOSITORY):$(DOCKER_TAG)-i386 | gzip > $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386.tar.gz
43+
.PHONY: alpine
44+
alpine: ## Build alpine images
45+
alpine: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-alpine.tar.gz
46+
alpine: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-alpine-build.tar.gz
47+
48+
$(BUILD_CONTEXT)/ubuntu32: $(BUILD_CONTEXT)/ubuntu32/crystal.deb
49+
cp ubuntu.Dockerfile $@/Dockerfile
50+
51+
$(BUILD_CONTEXT)/ubuntu64: $(BUILD_CONTEXT)/ubuntu64/crystal.deb
52+
cp ubuntu.Dockerfile $@/Dockerfile
53+
54+
$(BUILD_CONTEXT)/alpine: $(BUILD_CONTEXT)/alpine/crystal.tar.gz
55+
cp alpine.Dockerfile $@/Dockerfile
56+
57+
%/crystal.deb:
58+
mkdir -p $(shell dirname $@)
59+
cp $(CRYSTAL_DEB) $@
3460

35-
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386-build.tar.gz: $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386.tar.gz
61+
%/crystal.tar.gz:
62+
mkdir -p $(shell dirname $@)
63+
cp $(CRYSTAL_TARGZ) $@
64+
65+
$(OUTPUT_DIR):
3666
mkdir -p $(OUTPUT_DIR)
37-
docker build $(BUILD_ARGS32) --target build -t $(DOCKER_REPOSITORY):$(DOCKER_TAG)-i386-build .
38-
docker save $(DOCKER_REPOSITORY):$(DOCKER_TAG)-i386-build | gzip > $(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-i386-build.tar.gz
67+
68+
# Ubuntu x86_64
69+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-x86_64.tar.gz: $(BUILD_CONTEXT)/ubuntu64 $(OUTPUT_DIR)
70+
docker build -t $(DOCKER_TAG_UBUNTU) --target runtime $(BUILD_ARGS_UBUNTU64)
71+
docker save $(DOCKER_TAG_UBUNTU) | gzip > $@
72+
73+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-x86_64-build.tar.gz: $(BUILD_CONTEXT)/ubuntu64 $(OUTPUT_DIR)
74+
docker build -t $(DOCKER_TAG_UBUNTU)-build --target build $(BUILD_ARGS_UBUNTU64)
75+
docker save $(DOCKER_TAG_UBUNTU)-build | gzip > $@
76+
77+
# Ubuntu i386
78+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-i386.tar.gz: $(BUILD_CONTEXT)/ubuntu32 $(OUTPUT_DIR)
79+
docker build -t $(DOCKER_TAG_UBUNTU)-i386 --target runtime $(BUILD_ARGS_UBUNTU32)
80+
docker save $(DOCKER_TAG_UBUNTU)-i386 | gzip > $@
81+
82+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-ubuntu-i386-build.tar.gz: $(BUILD_CONTEXT)/ubuntu32 $(OUTPUT_DIR)
83+
docker build -t $(DOCKER_TAG_UBUNTU)-i386-build --target build $(BUILD_ARGS_UBUNTU32)
84+
docker save $(DOCKER_TAG_UBUNTU)-i386-build | gzip > $@
85+
86+
# Alpine x86_64
87+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-alpine.tar.gz: $(BUILD_CONTEXT)/alpine $(OUTPUT_DIR)
88+
docker build -t $(DOCKER_TAG_ALPINE) --target runtime $(BUILD_ARGS_ALPINE)
89+
docker save $(DOCKER_TAG_ALPINE) | gzip > $@
90+
91+
$(OUTPUT_DIR)/docker-$(CRYSTAL_VERSION)-alpine-build.tar.gz: $(BUILD_CONTEXT)/alpine $(OUTPUT_DIR)
92+
docker build -t $(DOCKER_TAG_ALPINE)-build --target build $(BUILD_ARGS_ALPINE)
93+
docker save $(DOCKER_TAG_ALPINE)-build | gzip > $@
3994

4095
.PHONY: clean
41-
clean: ## Clean up build directory
96+
clean: ## Clean up build and output directories
4297
rm -Rf $(OUTPUT_DIR)
43-
rm -Rf $(CURDIR)/tmp
98+
rm -Rf $(BUILD_CONTEXT)
99+
100+
.PHONY: help
101+
help: ## Show this help
102+
@echo
103+
@printf '\033[34mtargets:\033[0m\n'
104+
@grep -hE '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) |\
105+
sort |\
106+
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
107+
@echo
108+
@printf '\033[34mconfiguration variables:\033[0m\n'
109+
@grep -hE '^[a-zA-Z0-9_-]+ \?=.*?## .*$$' $(MAKEFILE_LIST) |\
110+
sort |\
111+
awk 'BEGIN {FS = " \\?=.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
112+
@echo
113+
@printf '\033[34mrecipes:\033[0m\n'
114+
@grep -hE '^##.*$$' $(MAKEFILE_LIST) |\
115+
awk 'BEGIN {FS = "## "}; /^## [a-zA-Z_-]/ {printf " \033[36m%s\033[0m\n", $$2}; /^## / {printf " %s\n", $$2}'

docker/alpine.Dockerfile

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
FROM alpine:3.11 as runtime
2+
3+
RUN \
4+
apk add --update --no-cache --force-overwrite \
5+
# core dependencies
6+
gc-dev gcc gmp-dev libatomic_ops libevent-dev musl-dev pcre-dev \
7+
# stdlib dependencies
8+
libxml2-dev openssl-dev readline-dev tzdata yaml-dev zlib-dev \
9+
# dev tools
10+
make git
11+
12+
ARG crystal_targz
13+
COPY ${crystal_targz} /tmp/crystal.tar.gz
14+
15+
RUN \
16+
tar -xz -C /usr --strip-component=1 -f /tmp/crystal.tar.gz \
17+
--exclude */lib/crystal/lib \
18+
--exclude */share/crystal/src/llvm/ext/llvm_ext.o \
19+
--exclude */share/crystal/src/ext/libcrystal.a && \
20+
rm /tmp/crystal.tar.gz
21+
22+
# Build libcrystal
23+
RUN \
24+
cd /usr/share/crystal && \
25+
cc -fPIC -c -o src/ext/sigfault.o src/ext/sigfault.c && \
26+
ar -rcs src/ext/libcrystal.a src/ext/sigfault.o
27+
28+
CMD ["/bin/sh"]
29+
30+
FROM runtime as build
31+
32+
RUN \
33+
apk add --update --no-cache --force-overwrite \
34+
llvm-dev llvm-static g++
35+
36+
ENV LIBRARY_PATH=/usr/lib/crystal/lib/
37+
38+
CMD ["/bin/sh"]
File renamed without changes.

0 commit comments

Comments
 (0)