From b4d0c030fb05682ad684927f3c8a0f8f9c11e517 Mon Sep 17 00:00:00 2001 From: Endial Fang Date: Tue, 15 Dec 2020 09:31:01 +0800 Subject: [PATCH] =?UTF-8?q?[fix:8]=E9=92=88=E5=AF=B9aliyun=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E6=9C=8D=E5=8A=A1=E5=99=A8=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E4=BB=93=E5=BA=93=E5=9C=B0=E5=9D=80=EF=BC=9B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E6=BA=90=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=BAaliyun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 64 +++++++++++++++++++++++++++---------------- Makefile | 26 ++++++++++-------- alpine/Dockerfile | 70 +++++++++++++++++++++++++++++------------------ 3 files changed, 97 insertions(+), 63 deletions(-) diff --git a/Dockerfile b/Dockerfile index dec322f..5ea5b28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,17 @@ -# Ver: 1.2 by Endial Fang (endial@126.com) +# Ver: 1.4 by Endial Fang (endial@126.com) # -FROM colovu/dbuilder as builder + +# 预处理 ========================================================================= +ARG registry_url="registry.cn-shenzhen.aliyuncs.com" +FROM ${registry_url}/colovu/dbuilder as builder # sources.list 可使用版本:default / tencent / ustc / aliyun / huawei -ARG apt_source=tencent +ARG apt_source=aliyun # 编译镜像时指定用于加速的本地服务器地址 ARG local_url="" + +# 下载并解压软件包 RUN set -eux; \ appVersion=8u262b10; \ appName=OpenJDK8U-jre_x64_linux_${appVersion}.tar.gz; \ @@ -18,29 +23,36 @@ RUN set -eux; \ download_pkg unpack ${appName} "${appUrls}" -g "${appKeys}"; # 镜像生成 ======================================================================== -FROM colovu/debian:10 -ARG apt_source=default -ARG local_url="" +FROM ${registry_url}/colovu/debian:10 -ENV JAVA_VERSION=8u262-b10 \ - JAVA_HOME=/usr/local/openjdk8 +# sources.list 可使用版本:default / tencent / ustc / aliyun / huawei +ARG apt_source=aliyun -ENV JRE_HOME="${JAVA_HOME}/jre" \ - CLASSPATH="${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib" \ - LANG=zh_CN.UTF-8 \ - PATH="${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:${PATH}" +ENV APP_NAME=openjdk8 \ + APP_VERSION=8u262-b10 + +# 纯 JRE 版本仅包含 JRE 相关资源 +ENV JAVA_HOME=/usr/local/${APP_NAME} \ + JRE_HOME=/usr/local/${APP_NAME} + +ENV PATH="${JAVA_HOME}/bin:${PATH}" \ + CLASSPATH=".:${JAVA_HOME}/lib" \ + LANG=zh_CN.UTF-8 LABEL \ - "Version"="v${JAVA_VERSION}" \ - "Description"="Docker image for openJRE v${JAVA_VERSION}." \ + "Version"="v${APP_VERSION}" \ + "Description"="Docker image for openJRE v${APP_VERSION}." \ "Dockerfile"="https://github.com/colovu/docker-openjre" \ "Vendor"="Endial Fang (endial@126.com)" -RUN select_source ${apt_source} -RUN install_pkg p11-kit ca-certificates dmidecode +# 从预处理过程中拷贝软件包(Optional),可以使用阶段编号或阶段命名定义来源 +COPY --from=builder /usr/local/openjdk-8u262-b10-jre ${JAVA_HOME} -RUN mkdir -p ${JAVA_HOME} -COPY --from=builder /usr/local/openjdk-8u262-b10-jre/ ${JAVA_HOME} +# 选择软件包源(Optional),以加速后续软件包安装 +RUN select_source ${apt_source} + +# 安装依赖的软件包及库(Optional) +RUN install_pkg p11-kit ca-certificates dmidecode # 更新 OpenJDK 绑定的证书 # 8-jdk uses "${JAVA_HOME}/jre/lib/security/cacerts" and @@ -61,11 +73,15 @@ RUN set -eux; \ ldconfig; \ \ # 解决应用安装jre-headless时错误:update-alternatives: error: error creating symbolic link '/usr/share/man/man - mkdir -p /usr/share/man/man1; \ - \ -# 验证安装的软件是否可以正常运行,常规情况下放置在命令行的最后 - java -version; + mkdir -p /usr/share/man/man1; -WORKDIR / +# 执行预处理脚本,并验证安装的软件包 +RUN set -eux; \ + override_file="/usr/local/overrides/overrides-${APP_VERSION}.sh"; \ + [ -e "${override_file}" ] && /bin/bash "${override_file}"; \ + java -version; \ + gosu --version; + +# 应用程序的服务命令,必须使用非守护进程方式运行。如果使用变量,则该变量必须在运行环境中存在(ENV可以获取) +CMD [] -CMD [] \ No newline at end of file diff --git a/Makefile b/Makefile index b03dd4e..0d413ee 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,16 @@ -# Ver: 1.4 by Endial Fang (endial@126.com) +# Ver: 1.7 by Endial Fang (endial@126.com) # # 当前 Docker 镜像的编译脚本 +registry_url :=registry.cn-shenzhen.aliyuncs.com app_name :=colovu/openjre # 生成镜像TAG,类似: -# <镜像名>:<分支名>- # Git 仓库且无文件修改直接编译 +# <镜像名>:<分支名>- # Git 仓库且无文件修改直接编译 # <镜像名>:<分支名>-<年月日>-<时分秒> # Git 仓库有文件修改后的编译 # <镜像名>:latest-<年月日>-<时分秒> # 非 Git 仓库编译 current_subversion:=$(shell if [ ! `git status >/dev/null 2>&1` ]; then git rev-parse --short HEAD; else date +%y%m%d-%H%M%S; fi) -current_tag:=$(shell if [ ! `git status >/dev/null 2>&1` ]; then git rev-parse --abbrev-ref HEAD | sed -e 's/master/latest/'; else echo "latest"; fi)-$(current_subversion) +current_tag:=local-$(shell if [ ! `git status >/dev/null 2>&1` ]; then git rev-parse --abbrev-ref HEAD | sed -e 's/master/latest/'; else echo "latest"; fi)-$(current_subversion) # Sources List: default / tencent / ustc / aliyun / huawei build-arg:=--build-arg apt_source=tencent @@ -26,27 +27,28 @@ build: build-alpine build-debian build-debian: @echo "Build $(app_name):$(current_tag)" @docker build --force-rm $(build-arg) -t $(app_name):$(current_tag) . - @echo "Add tag: $(app_name):latest" - @docker tag $(app_name):$(current_tag) $(app_name):latest + @echo "Add tag: $(app_name):local-latest" + @docker tag $(app_name):$(current_tag) $(app_name):local-latest build-alpine: @echo "Build $(app_name):$(current_tag)-alpine" @docker build --force-rm $(build-arg) -t $(app_name):$(current_tag)-alpine ./alpine - @echo "Add tag: $(app_name):latest-alpine" - @docker tag $(app_name):$(current_tag)-alpine $(app_name):latest-alpine + @echo "Add tag: $(app_name):local-latest-alpine" + @docker tag $(app_name):$(current_tag)-alpine $(app_name):local-latest-alpine # 清理悬空的镜像(无TAG)及停止的容器 -clean: +clearclean: clean @echo "Clean untaged images and stoped containers..." - @docker ps -a | grep "Exited" | awk '{print $$1}' | xargs docker rm - @docker images | grep '' | awk '{print $$3}' | xargs docker rmi -f + @docker ps -a | grep "Exited" | awk '{print $$1}' | sort -u | xargs -L 1 docker rm + @docker images | grep '' | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f # 为了防止删除前缀名相同的镜像,在过滤条件中加入一个空格进行过滤 -clearclean: clean +clean: @echo "Clean all images for current application..." - @docker images | grep "$(app_name) " | awk '{print $$3}' | xargs docker rmi -f + @docker images | grep "$(app_name) " | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f # 更新所有 colovu 仓库的镜像 upgrade: @echo "Upgrade all images..." @docker images | grep 'colovu' | grep -v '' | grep -v "latest-" | awk '{print $$1":"$$2}' | sort -u | xargs -L 1 docker pull + diff --git a/alpine/Dockerfile b/alpine/Dockerfile index 5412139..7387788 100644 --- a/alpine/Dockerfile +++ b/alpine/Dockerfile @@ -1,12 +1,17 @@ -# Ver: 1.2 by Endial Fang (endial@126.com) +# Ver: 1.4 by Endial Fang (endial@126.com) # -FROM colovu/abuilder as builder + +# 预处理 ========================================================================= +ARG registry_url="registry.cn-shenzhen.aliyuncs.com" +FROM ${registry_url}/colovu/abuilder as builder # sources.list 可使用版本:default / tencent / ustc / aliyun / huawei -ARG apt_source=tencent +ARG apt_source=aliyun # 编译镜像时指定用于加速的本地服务器地址 ARG local_url="" + +# 下载并解压软件包 RUN set -eux; \ appVersion=8u262b10; \ appName=OpenJDK8U-jre_x64_linux_${appVersion}.tar.gz; \ @@ -18,33 +23,40 @@ RUN set -eux; \ download_pkg unpack ${appName} "${appUrls}" -g "${appKeys}"; # 镜像生成 ======================================================================== -FROM colovu/alpine:3.12 -ARG apt_source=default -ARG local_url="" +FROM ${registry_url}/colovu/alpine:3.12 -ENV JAVA_VERSION=8u262-b10 \ - JAVA_HOME=/usr/local/openjdk8 +# sources.list 可使用版本:default / tencent / ustc / aliyun / huawei +ARG apt_source=aliyun -ENV JRE_HOME="${JAVA_HOME}/jre" \ - CLASSPATH="${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib" \ - LANG=C.UTF-8 \ - PATH="${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:${PATH}" +ENV APP_NAME=openjdk8 \ + APP_VERSION=8u262-b10 + +# 纯 JRE 版本仅包含 JRE 相关资源 +ENV JAVA_HOME=/usr/local/${APP_NAME} \ + JRE_HOME=/usr/local/${APP_NAME} + +ENV PATH="${JAVA_HOME}/bin:${PATH}" \ + CLASSPATH=".:${JAVA_HOME}/lib" \ + LANG=C.UTF-8 LABEL \ - "Version"="v${JAVA_VERSION}" \ - "Description"="Docker image for openJRE v${JAVA_VERSION}." \ + "Version"="v${APP_VERSION}" \ + "Description"="Docker image for openJRE v${APP_VERSION}." \ "Dockerfile"="https://github.com/colovu/docker-openjre" \ "Vendor"="Endial Fang (endial@126.com)" -RUN select_source ${apt_source} -RUN install_pkg p11-kit p11-kit-trust ca-certificates dmidecode +# 从预处理过程中拷贝软件包(Optional),可以使用阶段编号或阶段命名定义来源 +COPY --from=builder /usr/local/openjdk-8u262-b10-jre ${JAVA_HOME} -RUN mkdir -p ${JAVA_HOME} -COPY --from=builder /usr/local/openjdk-8u262-b10-jre/ ${JAVA_HOME} +# 选择软件包源(Optional),以加速后续软件包安装 +RUN select_source ${apt_source} + +# 安装依赖的软件包及库(Optional) +RUN install_pkg p11-kit p11-kit-trust ca-certificates dmidecode # 安装 Glibc RUN set -eux; \ - wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ + curl -sSL -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ appVersion=2.32-r0; \ appName=glibc-${appVersion}.apk; \ [ -n ${local_url} ] && localURL=${local_url}/glibc; \ @@ -63,7 +75,7 @@ RUN set -eux; \ # 安装 Glibc-bin;系统自带的 ldconfig 存在 bug RUN set -eux; \ - wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ + curl -sSL -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ appVersion=2.32-r0; \ appName=glibc-bin-${appVersion}.apk; \ [ -n ${local_url} ] && localURL=${local_url}/glibc; \ @@ -76,7 +88,7 @@ RUN set -eux; \ # 安装 Glibc-i18n;增加中文支持 RUN set -eux; \ - wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ + curl -sSL -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub; \ appVersion=2.32-r0; \ appName=glibc-i18n-${appVersion}.apk; \ [ -n ${local_url} ] && localURL=${local_url}/glibc; \ @@ -109,11 +121,15 @@ RUN set -eux; \ /usr/glibc-compat/sbin/ldconfig; \ \ # 解决应用安装jre-headless时错误:update-alternatives: error: error creating symbolic link '/usr/share/man/man - mkdir -p /usr/share/man/man1; \ - \ -# 验证安装的软件是否可以正常运行,常规情况下放置在命令行的最后 - java -version; + mkdir -p /usr/share/man/man1; -WORKDIR / +# 执行预处理脚本,并验证安装的软件包 +RUN set -eux; \ + override_file="/usr/local/overrides/overrides-${APP_VERSION}.sh"; \ + [ -e "${override_file}" ] && /bin/bash "${override_file}"; \ + java -version; \ + gosu --version; + +# 应用程序的服务命令,必须使用非守护进程方式运行。如果使用变量,则该变量必须在运行环境中存在(ENV可以获取) +CMD [] -CMD [] \ No newline at end of file