docker.mk 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/usr/bin/make -f
  2. # -*- makefile -*-
  3. ## default globals
  4. TARGET ?= emqx/emqx
  5. QEMU_ARCH ?= x86_64
  6. ARCH ?= amd64
  7. QEMU_VERSION ?= v5.0.0-2
  8. OS ?= alpine
  9. export PKG_VSN ?= $(shell $(CURDIR)/pkg-vsn.sh)
  10. ifeq ($(findstring emqx-ee, $(TARGET)), emqx-ee)
  11. ARCH_LIST := amd64 arm64v8 arm32v7
  12. EMQX_NAME := emqx-ee
  13. else ifeq ($(findstring emqx-edge, $(TARGET)), emqx-edge)
  14. ARCH_LIST := amd64 arm64v8 arm32v7 i386 s390x
  15. EMQX_NAME := emqx-edge
  16. else
  17. ARCH_LIST := amd64 arm64v8 arm32v7 i386 s390x
  18. EMQX_NAME := emqx
  19. endif
  20. .PHONY: docker
  21. docker: docker-build docker-tag docker-save
  22. .PHONY: docker-prepare
  23. docker-prepare:
  24. ## Prepare the machine before any code installation scripts
  25. # @echo "PREPARE: Setting up dependencies."
  26. # @apt update -y
  27. # @apt install --only-upgrade docker-ce -y
  28. ## Update docker configuration to enable docker manifest command
  29. @echo "PREPARE: Updating docker configuration"
  30. @mkdir -p $$HOME/.docker
  31. # enable experimental to use docker manifest command
  32. @echo '{ "experimental": "enabled" }' | tee $$HOME/.docker/config.json
  33. # enable experimental
  34. @echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50 }' | tee /etc/docker/daemon.json
  35. @service docker restart
  36. .PHONY: docker-build
  37. docker-build:
  38. ## Build Docker image
  39. @echo "DOCKER BUILD: Build Docker image."
  40. @echo "DOCKER BUILD: build version -> $(PKG_VSN)."
  41. @echo "DOCKER BUILD: arch - $(ARCH)."
  42. @echo "DOCKER BUILD: qemu arch - $(QEMU_ARCH)."
  43. @echo "DOCKER BUILD: docker repo - $(TARGET) "
  44. @echo "DOCKER BUILD: emqx name - $(EMQX_NAME)."
  45. ## Prepare qemu to build images other then x86_64 on travis
  46. @echo "PREPARE: Qemu" \
  47. && docker run --rm --privileged multiarch/qemu-user-static:register --reset
  48. @mkdir -p tmp \
  49. && cd tmp \
  50. && curl -L -o qemu-$(QEMU_ARCH)-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/$(QEMU_VERSION)/qemu-$(QEMU_ARCH)-static.tar.gz \
  51. && tar xzf qemu-$(QEMU_ARCH)-static.tar.gz \
  52. && cd -
  53. @docker build --no-cache \
  54. --build-arg PKG_VSN=$(PKG_VSN) \
  55. --build-arg BUILD_FROM=emqx/build-env:erl23.2.7.2-emqx-1-alpine-$(ARCH) \
  56. --build-arg RUN_FROM=$(ARCH)/alpine:3.12 \
  57. --build-arg EMQX_NAME=$(EMQX_NAME) \
  58. --build-arg QEMU_ARCH=$(QEMU_ARCH) \
  59. --tag $(TARGET):build-$(OS)-$(ARCH) \
  60. -f deploy/docker/Dockerfile .
  61. .PHONY: docker-tag
  62. docker-tag:
  63. @echo "DOCKER TAG: Tag Docker image."
  64. @for arch in $(ARCH_LIST); do \
  65. if [ -n "$$(docker images -q $(TARGET):build-$(OS)-$${arch})" ]; then \
  66. docker tag $(TARGET):build-$(OS)-$${arch} $(TARGET):$(PKG_VSN)-$(OS)-$${arch}; \
  67. echo "DOCKER TAG: $(TARGET):$(PKG_VSN)-$(OS)-$${arch}"; \
  68. if [ $${arch} = amd64 ]; then \
  69. docker tag $(TARGET):$(PKG_VSN)-$(OS)-amd64 $(TARGET):$(PKG_VSN); \
  70. echo "DOCKER TAG: $(TARGET):$(PKG_VSN)"; \
  71. fi; \
  72. fi; \
  73. done
  74. .PHONY: docker-save
  75. docker-save:
  76. @echo "DOCKER SAVE: Save Docker image."
  77. @mkdir -p _packages/$(EMQX_NAME)
  78. @if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN))" ]; then \
  79. docker save $(TARGET):$(PKG_VSN) > $(EMQX_NAME)-docker-$(PKG_VSN); \
  80. zip -r -m $(EMQX_NAME)-docker-$(PKG_VSN).zip $(EMQX_NAME)-docker-$(PKG_VSN); \
  81. mv ./$(EMQX_NAME)-docker-$(PKG_VSN).zip _packages/$(EMQX_NAME)/$(EMQX_NAME)-docker-$(PKG_VSN).zip; \
  82. fi
  83. @for arch in $(ARCH_LIST); do \
  84. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  85. docker save $(TARGET):$(PKG_VSN)-$(OS)-$${arch} > $(EMQX_NAME)-docker-$(PKG_VSN)-$(OS)-$${arch}; \
  86. zip -r -m $(EMQX_NAME)-docker-$(PKG_VSN)-$(OS)-$${arch}.zip $(EMQX_NAME)-docker-$(PKG_VSN)-$(OS)-$${arch}; \
  87. mv ./$(EMQX_NAME)-docker-$(PKG_VSN)-$(OS)-$${arch}.zip _packages/$(EMQX_NAME)/$(EMQX_NAME)-docker-$(PKG_VSN)-$(OS)-$${arch}.zip; \
  88. fi; \
  89. done
  90. .PHONY: docker-push
  91. docker-push:
  92. @echo "DOCKER PUSH: Push Docker image.";
  93. @echo "DOCKER PUSH: pushing - $(TARGET):$(PKG_VSN).";
  94. @if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN))" ]; then \
  95. docker push $(TARGET):$(PKG_VSN); \
  96. docker tag $(TARGET):$(PKG_VSN) $(TARGET):latest; \
  97. docker push $(TARGET):latest; \
  98. fi;
  99. @for arch in $(ARCH_LIST); do \
  100. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  101. docker push $(TARGET):$(PKG_VSN)-$(OS)-$${arch}; \
  102. fi; \
  103. done
  104. .PHONY: docker-manifest-list
  105. docker-manifest-list:
  106. version="docker manifest create --amend $(TARGET):$(PKG_VSN)"; \
  107. latest="docker manifest create --amend $(TARGET):latest"; \
  108. for arch in $(ARCH_LIST); do \
  109. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ];then \
  110. version="$${version} $(TARGET):$(PKG_VSN)-$(OS)-$${arch} "; \
  111. latest="$${latest} $(TARGET):$(PKG_VSN)-$(OS)-$${arch} "; \
  112. fi; \
  113. done; \
  114. eval $$version; \
  115. eval $$latest;
  116. for arch in $(ARCH_LIST); do \
  117. case $${arch} in \
  118. "amd64") \
  119. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  120. docker manifest annotate $(TARGET):$(PKG_VSN) $(TARGET):$(PKG_VSN)-$(OS)-amd64 --os=linux --arch=amd64; \
  121. docker manifest annotate $(TARGET):latest $(TARGET):$(PKG_VSN)-$(OS)-amd64 --os=linux --arch=amd64; \
  122. fi; \
  123. ;; \
  124. "arm64v8") \
  125. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  126. docker manifest annotate $(TARGET):$(PKG_VSN) $(TARGET):$(PKG_VSN)-$(OS)-arm64v8 --os=linux --arch=arm64 --variant=v8; \
  127. docker manifest annotate $(TARGET):latest $(TARGET):$(PKG_VSN)-$(OS)-arm64v8 --os=linux --arch=arm64 --variant=v8; \
  128. fi; \
  129. ;; \
  130. "arm32v7") \
  131. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  132. docker manifest annotate $(TARGET):$(PKG_VSN) $(TARGET):$(PKG_VSN)-$(OS)-arm32v7 --os=linux --arch=arm --variant=v7; \
  133. docker manifest annotate $(TARGET):latest $(TARGET):$(PKG_VSN)-$(OS)-arm32v7 --os=linux --arch=arm --variant=v7; \
  134. fi; \
  135. ;; \
  136. "i386") \
  137. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  138. docker manifest annotate $(TARGET):$(PKG_VSN) $(TARGET):$(PKG_VSN)-$(OS)-i386 --os=linux --arch=386; \
  139. docker manifest annotate $(TARGET):latest $(TARGET):$(PKG_VSN)-$(OS)-i386 --os=linux --arch=386; \
  140. fi; \
  141. ;; \
  142. "s390x") \
  143. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  144. docker manifest annotate $(TARGET):$(PKG_VSN) $(TARGET):$(PKG_VSN)-$(OS)-s390x --os=linux --arch=s390x; \
  145. docker manifest annotate $(TARGET):latest $(TARGET):$(PKG_VSN)-$(OS)-s390x --os=linux --arch=s390x; \
  146. fi; \
  147. ;; \
  148. esac; \
  149. done;
  150. docker manifest inspect $(TARGET):$(PKG_VSN)
  151. docker manifest push $(TARGET):$(PKG_VSN);
  152. docker manifest inspect $(TARGET):latest
  153. docker manifest push $(TARGET):latest;
  154. .PHONY: docker-clean
  155. docker-clean:
  156. @echo "DOCKER CLEAN: Clean Docker image."
  157. @if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN))" ]; then docker rmi -f $$(docker images -q $(TARGET):$(PKG_VSN)); fi
  158. @for arch in $(ARCH_LIST); do \
  159. if [ -n "$$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch})" ]; then \
  160. docker rmi -f $$(docker images -q $(TARGET):$(PKG_VSN)-$(OS)-$${arch}); \
  161. fi \
  162. done