docker.mk 6.8 KB

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