docker.mk 6.7 KB

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