# Ver: 1.2 by Endial Fang (endial@126.com) # # 预处理 ========================================================================= FROM colovu/abuilder as builder # sources.list 可使用版本:default / tencent / ustc / aliyun / huawei ARG apt_source=default # 编译镜像时指定用于加速的本地服务器地址 ARG local_url="" WORKDIR /usr/local RUN select_source ${apt_source}; #RUN install_pkg xz-utils # 下载并解压软件包 #RUN set -eux; \ # appVersion=1.12; \ # appName=gosu-"$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \ # appKeys="0xB42F6819007F00F88E364FD4036A9C25BF357DD4"; \ # sha256="04fa1fddc39bd1aecb6739dd5dd73858a3515b427acd1e2947a66dadce868d68"; \ # [ ! -z ${local_url} ] && localURL=${local_url}/gosu; \ # appUrls="${localURL:-} \ # https://github.com/tianon/gosu/releases/download/${appVersion} \ # "; \ # download_pkg install ${appName} "${appUrls}" -g "${appKeys}" -s "${sha256}"; \ # download_pkg unpack ${appName} "${appUrls}"; \ # chmod +x /usr/local/bin/${appName}; # 源码编译软件包 #RUN set -eux; \ # 源码编译方式安装: 编译后将原始配置文件拷贝至 ${APP_DEF_DIR} 中 # APP_SRC="/usr/local/${APP_NAME}-${APP_VERSION}"; \ # mkdir -p /usr/local/${APP_NAME}; \ # cd ${APP_SRC}; \ # ./configure --prefix=/usr/local/${APP_NAME} \ # ; \ # make -j "$(nproc)"; \ # make PREFIX=/usr/local/${APP_NAME} install; \ # runDeps="$( \ # scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \ # | tr ',' '\n' \ # | sort -u \ # | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ # )"; \ # echo "${runDeps}" >/usr/local/${APP_NAME}/runDeps; \ # find /usr/local -name '*.a' -delete; \ # cp -rf ./conf/* ${APP_DEF_DIR}/; # Alpine:scanelf --needed --nobanner --format '%n#p' --recursive /usr/local | tr ',' '\n' | sort -u | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' # Debian: find /usr/local/redis/bin -type f -executable -exec ldd '{}' ';' | awk '/=>/ { print $(NF-1) }' | sort -u | xargs -r dpkg-query --search | cut -d: -f1 | sort -u # 镜像生成 ======================================================================== FROM colovu/alpine:3.12 ARG apt_source=default ARG local_url="" ENV APP_NAME=test \ APP_USER=builder \ APP_EXEC=/bin/bash \ APP_VERSION=1.0.0 ENV APP_HOME_DIR=/usr/local/${APP_NAME} \ APP_DEF_DIR=/etc/${APP_NAME} \ APP_CONF_DIR=/srv/conf/${APP_NAME} \ APP_DATA_DIR=/srv/data/${APP_NAME} \ APP_DATA_LOG_DIR=/srv/datalog/${APP_NAME} \ APP_CACHE_DIR=/var/cache/${APP_NAME} \ APP_RUN_DIR=/var/run/${APP_NAME} \ APP_LOG_DIR=/var/log/${APP_NAME} \ APP_CERT_DIR=/srv/cert/${APP_NAME} ENV \ PATH="${APP_HOME_DIR}/bin:${PATH}" \ LD_LIBRARY_PATH=${APP_HOME_DIR}/lib LABEL \ "Version"="v${APP_VERSION}" \ "Description"="Docker image for ${APP_NAME}(v${APP_VERSION})." \ "Dockerfile"="https://github.com/colovu/docker-${APP_NAME}" \ "Vendor"="Endial Fang (endial@126.com)" COPY customer / # 以包管理方式安装软件包(Optional) RUN select_source ${apt_source} #RUN install_pkg bash tini sudo libssl1.1 RUN create_user && prepare_env && mkdir -p ${APP_HOME_DIR}/bin ${APP_HOME_DIR}/lib # 从预处理过程中拷贝软件包(Optional) #COPY --from=0 /usr/local/bin/gosu-amd64 /usr/local/bin/gosu #COPY --from=builder /usr/local/redis /usr/local/redis #COPY --from=builder /usr/local/bin/gosu-amd64 /usr/local/bin/gosu RUN install_pkg `cat /usr/local/${APP_NAME}/lib/runDeps`; # 执行预处理脚本,并验证安装的软件包 RUN set -eux; \ override_file="/usr/local/overrides/overrides-${APP_VERSION}.sh"; \ [ -e "${override_file}" ] && /bin/bash "${override_file}"; \ export LD_LIBRARY_PATH=/usr/local/${APP_NAME}/lib; \ gosu ${APP_USER} ${APP_EXEC} --version ; \ :; # 默认提供的数据卷 VOLUME ["/srv/conf", "/srv/data", "/srv/datalog", "/srv/cert", "/var/log"] # 默认使用gosu切换为新建用户启动,必须保证端口在1024之上 EXPOSE 8080 # 容器初始化命令,默认存放在:/usr/local/bin/entry.sh ENTRYPOINT ["entry.sh"] # 应用程序的服务命令,必须使用非守护进程方式运行。如果使用变量,则该变量必须在运行环境中存在(ENV可以获取) CMD ["${APP_EXEC}"]