docker.mk 7.1 KB

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