diff --git a/Dockerfile b/Dockerfile index 7a52f14..5f4597d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -# Ver: 1.0 by Endial Fang (endial@126.com) +# Ver: 1.1 by Endial Fang (endial@126.com) # -FROM alpine:3.12 +FROM colovu/alpine-builder as builder # ARG参数使用"--build-arg"指定,如 "--build-arg apt_source=tencent" # sources.list 可使用版本:default / tencent / ustc / aliyun / huawei @@ -11,34 +11,11 @@ ARG local_url="" ARG gosu_ver=1.12 -LABEL \ - "Version"="v3.12" \ - "Description"="Alpine image for Alpine 3.12." \ - "Dockerfile"="https://github.com/colovu/docker-alpine" \ - "Vendor"="Endial Fang (endial@126.com)" - -COPY sources/* /etc/apk/ - RUN set -eux; \ - \ -# 更改源为当次编译指定的源 - cp /etc/apk/repositories.${apt_source} /etc/apk/repositories; \ - \ - apk update; \ - apk upgrade --no-cache;\ - apk add --no-cache bash; \ - \ -# 安装依赖软件包 - apk add --no-cache --virtual .fetch-deps \ - dpkg \ - gnupg \ - ; \ - \ -# 安装应用软件 dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ if [ -n "${local_url}" ]; then \ - wget -O /usr/local/bin/gosu "${local_url}/gosu-${dpkgArch}"; \ - wget -O /usr/local/bin/gosu.asc "${local_url}/gosu-${dpkgArch}.asc"; \ + wget -O /usr/local/bin/gosu "${local_url}/gosu/gosu-${dpkgArch}"; \ + wget -O /usr/local/bin/gosu.asc "${local_url}/gosu/gosu-${dpkgArch}.asc"; \ else \ wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${gosu_ver}/gosu-$dpkgArch"; \ wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${gosu_ver}/gosu-$dpkgArch.asc"; \ @@ -55,15 +32,37 @@ RUN set -eux; \ done; \ gpg --batch --verify "/usr/local/bin/gosu.asc" "/usr/local/bin/gosu"; \ command -v gpgconf > /dev/null && gpgconf --kill all; \ - rm -rf "$GNUPGHOME"; \ \ chmod +x /usr/local/bin/gosu; \ - rm -rf /usr/local/bin/gosu.asc; \ - \ -# 删除安装的依赖软件包 - apk del --no-network .fetch-deps; \ \ # 验证安装的应用软件是否正常 gosu nobody true; +# 镜像生成 +FROM alpine:3.12 +ARG apt_source=default + +LABEL \ + "Version"="v3.12" \ + "Description"="Alpine image for Alpine 3.12." \ + "Dockerfile"="https://github.com/colovu/docker-alpine" \ + "Vendor"="Endial Fang (endial@126.com)" + +COPY sources/* /etc/apk/ + +RUN set -eux; \ + cp /etc/apk/repositories.${apt_source} /etc/apk/repositories; \ + \ + apk update; \ + apk upgrade --no-cache; \ + apk add --no-cache bash tini; \ + \ + rm -rf /var/cache/apk/*; \ + rm -rf /root/.cache; \ + rm -rf /tmp/*; + +COPY --from=builder /usr/local/bin/gosu /usr/local/bin/ + +WORKDIR /srv/data + CMD [] diff --git a/Makefile b/Makefile index c923d08..d927406 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,40 @@ +# Ver: 1.3 by Endial Fang (endial@126.com) +# +# 当前 Docker 镜像的编译脚本 -current_branch := $(shell git rev-parse --abbrev-ref HEAD) +app_name := colovu/alpine + +# 生成镜像TAG,类似:<镜像名>:<分支名>- 或 <镜像名>:latest-<年月日>-<时分秒> +current_subversion:=$(shell if [[ -d .git ]]; then git rev-parse --short HEAD; else date +%y%m%d-%H%M%S; fi) +current_tag:=$(shell if [[ -d .git ]]; 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 -build-arg += --build-arg local_url=http://192.168.48.132/dist-files/ +build-arg:=--build-arg apt_source=tencent + +# 设置本地下载服务器路径,加速调试时的本地编译速度 +local_ip:=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $$2}'|tr -d "addr:"` +build-arg+=--build-arg local_url=http://$(local_ip)/dist-files/ + +.PHONY: build clean clearclean upgrade build: - docker build --force-rm $(build-arg) -t alpine:$(current_branch) . + @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 + +# 清理悬空的镜像(无TAG)及停止的容器 +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 + +# 为了防止删除前缀名相同的镜像,在过滤条件中加入一个空格进行过滤 +clearclean: clean + @echo "Clean all images for current application..." + @docker images | grep "$(app_name) " | awk '{print $$3}' | xargs docker rmi -f + +# 更新所有 colovu 仓库的镜像 +upgrade: + @echo "Upgrade all images..." + @docker images | grep 'colovu' | grep -v '' | grep -v "latest-" | awk '{print $$1":"$$2}' | xargs -L 1 docker pull