From 141f7db3b5687fefab1de2a6ba9d1c80c2ee0830 Mon Sep 17 00:00:00 2001 From: Endial Fang Date: Thu, 17 Dec 2020 15:33:13 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 1 - Dockerfile | 12 +- Makefile | 46 +- README.md | 38 +- alpine/Dockerfile | 121 ----- alpine/customer/usr/local/bin/comm-appname.sh | 430 ------------------ alpine/customer/usr/local/bin/comm-env.sh | 41 -- alpine/customer/usr/local/bin/entry.sh | 37 -- alpine/customer/usr/local/bin/init.sh | 28 -- alpine/customer/usr/local/bin/run.sh | 27 -- alpine/customer/usr/local/bin/setup.sh | 40 -- .../usr/local/overrides/overrides-x.x.x.sh | 12 - alpine/customer/usr/sbin/create_user | 12 - alpine/customer/usr/sbin/prepare_env | 19 - customer/usr/local/bin/run.sh | 10 +- .../usr/local/overrides/overrides-x.x.x.sh | 5 +- customer/usr/sbin/create_user | 4 +- customer/usr/sbin/prepare_env | 4 +- docker-compose-cluster.yml | 13 +- docker-compose.yml | 5 +- 20 files changed, 74 insertions(+), 831 deletions(-) delete mode 100644 alpine/Dockerfile delete mode 100644 alpine/customer/usr/local/bin/comm-appname.sh delete mode 100644 alpine/customer/usr/local/bin/comm-env.sh delete mode 100755 alpine/customer/usr/local/bin/entry.sh delete mode 100755 alpine/customer/usr/local/bin/init.sh delete mode 100755 alpine/customer/usr/local/bin/run.sh delete mode 100755 alpine/customer/usr/local/bin/setup.sh delete mode 100644 alpine/customer/usr/local/overrides/overrides-x.x.x.sh delete mode 100755 alpine/customer/usr/sbin/create_user delete mode 100755 alpine/customer/usr/sbin/prepare_env diff --git a/.dockerignore b/.dockerignore index c0b11c0..4df4001 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,6 @@ .git .gitignore -./alpine ./Makefile *.yml diff --git a/Dockerfile b/Dockerfile index 5a9f458..45a860d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -# Ver: 1.4 by Endial Fang (endial@126.com) +# Ver: 1.5 by Endial Fang (endial@126.com) # # 预处理 ========================================================================= ARG registry_url="registry.cn-shenzhen.aliyuncs.com" FROM ${registry_url}/colovu/dbuilder as builder -# sources.list 可使用版本:default / tencent / ustc / aliyun / huawei +# 设置 apt-get 源:default / tencent / ustc / aliyun / huawei ARG apt_source=aliyun # 编译镜像时指定用于加速的本地服务器地址 @@ -15,7 +15,7 @@ ENV APP_NAME=test \ APP_VERSION=1.0.0 # 选择软件包源(Optional),以加速后续软件包安装 -RUN select_source ${apt_source}; +#RUN select_source ${apt_source}; # 安装依赖的软件包及库(Optional) #RUN install_pkg xz-utils @@ -61,8 +61,9 @@ RUN set -eux; \ # 镜像生成 ======================================================================== FROM ${registry_url}/colovu/debian:10 +FROM ${registry_url}/colovu/openjre:8 -# sources.list 可使用版本:default / tencent / ustc / aliyun / huawei +# 设置 apt-get 源:default / tencent / ustc / aliyun / huawei ARG apt_source=aliyun # 编译镜像时指定用于加速的本地服务器地址 @@ -95,7 +96,7 @@ RUN create_user && prepare_env #COPY --from=builder /usr/local/${APP_NAME}/ /usr/local/${APP_NAME} # 选择软件包源(Optional),以加速后续软件包安装 -RUN select_source ${apt_source} +#RUN select_source ${apt_source} # 安装依赖的软件包及库(Optional) #RUN install_pkg `cat /usr/local/${APP_NAME}/runDeps`; @@ -119,4 +120,3 @@ ENTRYPOINT ["entry.sh"] # 应用程序的服务命令,必须使用非守护进程方式运行。如果使用变量,则该变量必须在运行环境中存在(ENV可以获取) CMD ["${APP_EXEC}"] - diff --git a/Makefile b/Makefile index 737fb47..872507a 100644 --- a/Makefile +++ b/Makefile @@ -1,41 +1,39 @@ -# Ver: 1.7 by Endial Fang (endial@126.com) +# Ver: 1.8 by Endial Fang (endial@126.com) # # 当前 Docker 镜像的编译脚本 -registry_url :=registry.cn-shenzhen.aliyuncs.com -app_name :=colovu/template +# 定义镜像名称 +image_name :=colovu/template -# 生成镜像TAG,类似: -# <镜像名>:<分支名>- # Git 仓库且无文件修改直接编译 +# 定义默认镜像仓库地址 +registry_url :=registry.cn-shenzhen.aliyuncs.com + +# 定义系统默认使用的源服务器,包含:default / tencent / ustc / aliyun / huawei +apt_source :=aliyun + +# 定义镜像TAG,类似: +# <镜像名>:<分支名>-<7位Git ID> # 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:=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) +image_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) -# Sources List: default / tencent / ustc / aliyun / huawei -build-arg:=--build-arg apt_source=tencent +build-arg:=--build-arg registry_url=$(registry_url) +build-arg+=--build-arg apt_source=$(apt_source) # 设置本地下载服务器路径,加速调试时的本地编译速度 -local_ip:=`echo "en0 eth0" |xargs -n1 ip addr show 2>/dev/null|grep inet|grep -v 127.0.0.1|grep -v inet6|tr "/" " "|awk '{print $$2}'` +local_ip:=`echo "en0 eth0" | xargs -n1 ip addr show 2>/dev/null | grep inet | grep -v 127.0.0.1 | grep -v inet6 | tr "/" " " | awk '{print $$2}'` build-arg+=--build-arg local_url=http://$(local_ip)/dist-files -.PHONY: build build-debian build-alpine clean clearclean upgrade +.PHONY: build build clean clearclean upgrade -build: build-alpine build-debian +build: + @echo "Build $(image_name):$(image_tag)" + @docker build --force-rm $(build-arg) -t $(image_name):$(image_tag) . + @echo "Add tag: $(image_name):latest" + @docker tag $(image_name):$(image_tag) $(image_name):latest @echo "Build complete" -build-debian: - @echo "Build $(app_name):$(current_tag)" - @docker build --force-rm $(build-arg) -t $(app_name):$(current_tag) . - @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):local-latest-alpine" - @docker tag $(app_name):$(current_tag)-alpine $(app_name):local-latest-alpine - # 清理悬空的镜像(无TAG)及停止的容器 clearclean: clean @echo "Clean untaged images and stoped containers..." @@ -45,7 +43,7 @@ clearclean: clean # 为了防止删除前缀名相同的镜像,在过滤条件中加入一个空格进行过滤 clean: @echo "Clean all images for current application..." - @docker images | grep "$(app_name) " | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f + @docker images | grep "$(image_name) " | awk '{print $$3}' | sort -u | xargs -L 1 docker rmi -f # 更新所有 colovu 仓库的镜像 upgrade: diff --git a/README.md b/README.md index 1b88195..2c71110 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # AppName -针对 [AppName]() 应用的 Docker 镜像,用于提供 AppName 服务。 +针对 [AppName]() 应用的 Docker 镜像,用于提供 AppName 服务。容器详细使用说明可参考仓库:[Gitee](https://www.gitee.com/endial/studylife.git) 或 [Github](https://www.github.com/endial/studylife.git)中`服务器运维`相应文档。 使用说明可参照:[官方说明]() @@ -12,7 +12,9 @@ **镜像信息:** -* 镜像地址:registry.cn-shenzhen.aliyuncs.com/colovu/imgname +* 镜像地址: + - 国内镜像仓库:registry.cn-shenzhen.aliyuncs.com/colovu/imgname + - DockerHub:colovu/imgname @@ -21,14 +23,27 @@ Docker 快速启动命令: ```shell -$ docker run -d -e ALLOW_ANONYMOUS_LOGIN=yes colovu/imgname +# 从 Docker Hub 服务器下载镜像并启动 +$ docker run -d -e ALLOW_ANONYMOUS_LOGIN=yes colovu/imgname:1.0 + +# 从 Aliyun 服务器下载镜像并启动 +$ docker run -d -e ALLOW_ANONYMOUS_LOGIN=yes registry.cn-shenzhen.aliyuncs.com/colovu/imgname:1.0 ``` +- 后续相关命令行默认使用 Docker Hub 镜像服务器做说明 + + + Docker-Compose 快速启动命令: ```shell -$ curl -sSL https://raw.githubusercontent.com/colovu/docker-imgname/master/docker-compose.yml > docker-compose.yml +# 从 Gitee 下载 Compose 文件 +$ curl -sSL -o https://gitee.com/colovu/docker-imgname/raw/master/docker-compose.yml +# 从 Github 下载 Compose 文件 +$ curl -sSL -o https://raw.githubusercontent.com/colovu/docker-imgname/master/docker-compose.yml + +# 创建并启动容器 $ docker-compose up -d ``` @@ -76,15 +91,15 @@ $ docker run -d -e "APP_ENV_KEY_NAME=key_value" colovu/imgname 针对配置文件中的配置项,支持环境变量名自动替换,该类环境变量定义规则为:`APP_CFG_*=` - `APP_CFG_`:环境变量自动替换标识,具备该前缀的环境变量会被自动处理并更新至配置文件 -- `*`:配置文件中对应的配置项名,特殊字符替换规则 +- `*`:配置文件中对应的配置项名,大小写需要符合实际参数名要求;特殊字符需要符合`特殊字符替换规则` - ``:配置项对应值 例如: ```shell # 设置配置文件中配置项 max_wal_size,传入容器的变量为(两者都可以): -PG_CFG_max_wal_size=400MB -PG_CFG_max_wal_size="400MB" +APP_CFG_max_wal_size=400MB +APP_CFG_max_wal_size="400MB" # 容器启动后,应用配置文件中对应配置项生效,且设置为相应值: max_wal_size = '400MB' @@ -159,17 +174,22 @@ services: 本容器默认使用应用对应的运行时用户及用户组运行应用,以加强容器的安全性。在使用非`root`用户运行容器时,相关的资源访问会受限;应用仅能操作镜像创建时指定的路径及数据。使用`Non-root`方式的容器,更适合在生产环境中使用。 +如果需要赋予容器内应用访问外部设备的权限,可以使用以下两种方式: + +- 启动参数增加`--privileged=true`选项 +- 针对特定权限需要使用`--cap-add`单独增加特定赋权,如:ALL、NET_ADMIN、NET_RAW + ## 注意事项 -- 容器中启动参数不能配置为后台运行,如果应用使用后台方式运行,则容器的启动命令会在运行后自动退出,从而导致容器退出 +- 容器中应用的启动参数不能配置为后台运行,如果应用使用后台方式运行,则容器的启动命令会在运行后自动退出,从而导致容器退出 ## 更新记录 -- 1.0、latest +- 2021/1/1 (1.0): 初始版本 diff --git a/alpine/Dockerfile b/alpine/Dockerfile deleted file mode 100644 index d768d26..0000000 --- a/alpine/Dockerfile +++ /dev/null @@ -1,121 +0,0 @@ -# Ver: 1.4 by Endial Fang (endial@126.com) -# - -# 预处理 ========================================================================= -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=aliyun - -# 编译镜像时指定用于加速的本地服务器地址 -ARG local_url="" - -ENV APP_NAME=test \ - APP_VERSION=1.0.0 - -# 选择软件包源(Optional),以加速后续软件包安装 -RUN select_source ${apt_source}; - -# 安装依赖的软件包及库(Optional) -#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}/${APP_NAME}; \ -# 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}; - -# 源码编译: 编译后将配置文件模板拷贝至 /usr/local/${APP_NAME}/share/${APP_NAME} 中 -#RUN set -eux; \ -# APP_SRC="/usr/local/${APP_NAME}-${APP_VERSION}"; \ -# cd ${APP_SRC}; \ -# ./configure \ -# --prefix=/usr/local/${APP_NAME} \ -# ; \ -# make -j "$(nproc)"; \ -# make PREFIX=/usr/local/${APP_NAME} install; - -# 删除编译生成的多余文件 -RUN set -eux; \ - find /usr/local -name '*.a' -delete; \ - rm -rf /usr/local/${APP_NAME}/include; - -# 检测并生成依赖文件记录 -RUN set -eux; \ - scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/${APP_NAME} | \ - tr ',' '\n' | \ - sort -u | \ - awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } \ - { print "so:" $1 }' >/usr/local/${APP_NAME}/runDeps; - - -# 镜像生成 ======================================================================== -FROM ${registry_url}/colovu/alpine:3.12 - -# sources.list 可使用版本:default / tencent / ustc / aliyun / huawei -ARG apt_source=aliyun - -# 编译镜像时指定用于加速的本地服务器地址 -ARG local_url="" - -# 镜像所包含应用的基础信息 -ENV APP_NAME=test \ - APP_USER=builder \ - APP_EXEC=run.sh \ - APP_VERSION=1.0.0 - -ENV APP_HOME_DIR=/usr/local/${APP_NAME} \ - APP_DEF_DIR=/etc/${APP_NAME} - -ENV PATH="${APP_HOME_DIR}/bin:${APP_HOME_DIR}/sbin:${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 / -RUN create_user && prepare_env - -# 从预处理过程中拷贝软件包(Optional),可以使用阶段编号或阶段命名定义来源 -#COPY --from=0 /usr/local/${APP_NAME}/ /usr/local/${APP_NAME} -#COPY --from=builder /usr/local/${APP_NAME}/ /usr/local/${APP_NAME} - -# 选择软件包源(Optional),以加速后续软件包安装 -RUN select_source ${apt_source} - -# 安装依赖的软件包及库(Optional) -#RUN install_pkg `cat /usr/local/${APP_NAME}/runDeps`; -#RUN install_pkg bash tini sudo libssl1.1 - -# 执行预处理脚本,并验证安装的软件包 -RUN set -eux; \ - override_file="/usr/local/overrides/overrides-${APP_VERSION}.sh"; \ - [ -e "${override_file}" ] && /bin/bash "${override_file}"; \ - gosu ${APP_USER} ${APP_EXEC} --version ; \ - gosu --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}"] - diff --git a/alpine/customer/usr/local/bin/comm-appname.sh b/alpine/customer/usr/local/bin/comm-appname.sh deleted file mode 100644 index 37324c1..0000000 --- a/alpine/customer/usr/local/bin/comm-appname.sh +++ /dev/null @@ -1,430 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# 应用通用业务处理函数 - -# 加载依赖脚本 -. /usr/local/scripts/libcommon.sh # 通用函数库 - -. /usr/local/scripts/libfile.sh -. /usr/local/scripts/libfs.sh -. /usr/local/scripts/libos.sh -. /usr/local/scripts/libservice.sh -. /usr/local/scripts/libvalidations.sh - -# 函数列表 - -# 使用环境变量中以 "" 开头的的全局变量更新指定配置文件中对应项(以"."分隔) -# 如果需要全部转换为小写,可使用命令: tr '[:upper:]' '[:lower:]' -# 全局变量: -# _* : -# 替换规则(变量中字符 ==> 替换后全局变量中字符): -# - "." ==> "_" -# - "_" ==> "__" -# - "-" ==> "___" -# -# 变量: -# $1 - 配置文件 -# $2 - 前缀(不含结束的"_") -# -# 举例: -# CORE_CONF_fs_defaultFS 对应配置文件中的配置项:fs.defaultFS -appname_configure_from_environment() { - # Map environment variables to config properties - for var in "${!APP_CFG_@}"; do - key="$(echo "$var" | sed -e 's/^APP_CFG_//g' -e 's/_/\./g' | tr '[:upper:]' '[:lower:]')" - value="${!var}" - appname_conf_set "$key" "$value" - done - - local path="${1:?missing file}" - local envPrefix="${2:?missing parameters}" - - LOG_D " File: ${path}" - # Map environment variables to config properties - #for var in `printenv | grep ${envPrefix} | "${!${envPrefix}_@}"`; do - # LOG_D " Process: ${var}" - # key="$(echo "${var}" | sed -e 's/^${envPrefix}_//g' -e 's/___/-/g' -e 's/__/_/g' -e 's/_/\./g')" - # value="${!var}" - # hadoop_common_xml_set "${path}" "${key}" "${value}" - #done - #for var in $(printenv | grep ${envPrefix}); do - # LOG_D " Process: ${var}" - # key="$(echo "${var}" | sed -e 's/^${envPrefix}_//g' -e 's/___/-/g' -e 's/__/_/g' -e 's/_/\./g' )" - # value="${!var}" - # hadoop_common_xml_set "${path}" "${key}" "${value}" - #done - for c in `printenv | perl -sne 'print "$1 " if m/^${envPrefix}_(.+?)=.*/' -- -envPrefix=${envPrefix}`; do - name=`echo ${c} | perl -pe 's/___/-/g; s/__/_/g; s/_/./g;'` - key="${envPrefix}_${c}" - #LOG_D " Process: ${key} => ${!key}" - value="${!key}" - hadoop_common_xml_set "${path}" "${name}" "${value}" - done -} - -# 将变量配置更新至配置文件 -# 参数: -# $1 - 文件 -# $2 - 变量 -# $3 - 值(列表) -appname_common_conf_set() { - local file="${1:?missing file}" - local key="${2:?missing key}" - shift - shift - local values=("$@") - - if [[ "${#values[@]}" -eq 0 ]]; then - LOG_E "missing value" - return 1 - elif [[ "${#values[@]}" -ne 1 ]]; then - for i in "${!values[@]}"; do - appname_common_conf_set "$file" "${key[$i]}" "${values[$i]}" - done - else - value="${values[0]}" - # Check if the value was set before - if grep -q "^[#\\s]*$key\s*=.*" "$file"; then - # Update the existing key - replace_in_file "$file" "^[#\\s]*${key}\s*=.*" "${key}=${value}" false - else - # 增加一个新的配置项;如果在其他位置有类似操作,需要注意换行 - printf "%s=%s" "$key" "$value" >>"$file" - fi - fi -} - -# 更新 server.properties 配置文件中指定变量值 -# 变量: -# $1 - 变量 -# $2 - 值(列表) -appname_conf_set() { - appname_common_conf_set "${APP_CONF_DIR}/zoo.cfg" "$@" -} - -# 更新 log4j.properties 配置文件中指定变量值 -# 变量: -# $1 - 变量 -# $2 - 值(列表) -appname_log4j_set() { - appname_common_conf_set "${APP_CONF_DIR}/log4j.properties" "$@" -} - -# 使用环境变量中配置,更新配置文件 -appname_update_conf() { - LOG_I "Update configure files..." - -} - -# 生成默认配置文件 -appname_generate_conf() { - # 准备原始默认配置文件或生成空文件 - cp "${APP_CONF_DIR}/app_sample.cfg" "${APP_CONF_FILE}" - - echo "">> "${APP_CONF_FILE}" - - # 根据容器参数,设置配置文件 - appname_log4j_set "zookeeper.console.threshold" "${ZOO_LOG_LEVEL}" - appname_log4j_set "zookeeper.log.dir" "${APP_LOG_DIR}" - - appname_update_conf -} - -# 设置环境变量 JVMFLAGS -# 参数: -# $1 - value -appname_export_jvmflags() { - local -r value="${1:?value is required}" - - export JVMFLAGS="${JVMFLAGS} ${value}" - echo "export JVMFLAGS=\"${JVMFLAGS}\"" > "${APP_CONF_DIR}/java.env" -} - -# 配置 HEAP 大小 -# 参数: -# $1 - HEAP 大小 -appname_configure_heap_size() { - local -r heap_size="${1:?heap_size is required}" - - if [[ "${JVMFLAGS}" =~ -Xm[xs].*-Xm[xs] ]]; then - LOG_D "Using specified values (JVMFLAGS=${JVMFLAGS})" - else - LOG_D "Setting '-Xmx${heap_size}m -Xms${heap_size}m' heap options..." - appname_export_jvmflags "-Xmx${heap_size}m -Xms${heap_size}m" - fi -} - -# 检测用户参数信息是否满足条件; 针对部分权限过于开放情况,打印提示信息 -appname_verify_minimum_env() { - local error_code=0 - - LOG_D "Validating settings in APP_* env vars..." - - print_validation_error() { - LOG_E "$1" - error_code=1 - } - - # 检测认证设置。如果不允许匿名登录,检测登录用户名及密码是否设置 -# if is_boolean_yes "$ALLOW_ANONYMOUS_LOGIN"; then -# LOG_W "You have set the environment variable ALLOW_ANONYMOUS_LOGIN=${ALLOW_ANONYMOUS_LOGIN}. For safety reasons, do not use this flag in a production environment." -# elif ! is_boolean_yes "$ZOO_ENABLE_AUTH"; then -# print_validation_error "The ZOO_ENABLE_AUTH environment variable does not configure authentication. Set the environment variable ALLOW_ANONYMOUS_LOGIN=yes to allow unauthenticated users to connect to ZooKeeper." -# fi - - # TODO: 其他参数检测 - - [[ "$error_code" -eq 0 ]] || exit "$error_code" -} - -# 更改默认监听地址为 "*" 或 "0.0.0.0",以对容器外提供服务;默认配置文件应当为仅监听 localhost(127.0.0.1) -appname_enable_remote_connections() { - LOG_D "Modify default config to enable all IP access" - -} - -# 检测依赖的服务端口是否就绪;该脚本依赖系统工具 'netcat' -# 参数: -# $1 - host:port -appname_wait_service() { - local serviceport=${1:?Missing server info} - local service=${serviceport%%:*} - local port=${serviceport#*:} - local retry_seconds=5 - local max_try=100 - let i=1 - - if [[ -z "$(which nc)" ]]; then - LOG_E "Nedd nc installed before, command: \"apk add netcat-openbsd\"." - exit 1 - fi - - LOG_I "[0/${max_try}] check for ${service}:${port}..." - - set +e - nc -z ${service} ${port} - result=$? - - until [ $result -eq 0 ]; do - LOG_D " [$i/${max_try}] not available yet" - if (( $i == ${max_try} )); then - LOG_E "${service}:${port} is still not available; giving up after ${max_try} tries." - exit 1 - fi - - LOG_I "[$i/${max_try}] try in ${retry_seconds}s once again ..." - let "i++" - sleep ${retry_seconds} - - nc -z ${service} ${port} - result=$? - done - - set -e - LOG_I "[$i/${max_try}] ${service}:${port} is available." -} - -# 以后台方式启动应用服务,并等待启动就绪 -appname_start_server_bg() { - appname_is_server_running && return - - LOG_I "Starting ${APP_NAME} in background..." - - # 使用内置脚本启动服务 - #local start_command="zkServer.sh start" - #if is_boolean_yes "${ENV_DEBUG}"; then - # $start_command & - #else - # $start_command >/dev/null 2>&1 & - #fi - - # 使用内置命令启动服务 - # if [[ "${ENV_DEBUG:-false}" = true ]]; then - # debug_execute "rabbitmq-server" & - #else - # debug_execute "rabbitmq-server" >/dev/null 2>&1 & - #fi - - # 通过命令或特定端口检测应用是否就绪 - LOG_I "Checking ${APP_NAME} ready status..." - # wait-for-port --timeout 60 "$ZOO_PORT_NUMBER" - - LOG_D "${APP_NAME} is ready for service..." -} - -# 停止应用服务 -appname_stop_server() { - if appname_is_server_running ; then - LOG_I "Stopping ${APP_NAME}..." - - # 使用 PID 文件 kill 进程 - stop_service_using_pid "$APP_PID_FILE" - - # 使用内置命令停止服务 - #debug_execute "rabbitmqctl" stop - - # 使用内置脚本关闭服务 - #if [[ "$ENV_DEBUG" = true ]]; then - # "zkServer.sh" stop - #else - # "zkServer.sh" stop >/dev/null 2>&1 - #fi - - # 检测停止是否完成 - local counter=10 - while [[ "$counter" -ne 0 ]] && appname_is_server_running; do - LOG_D "Waiting for ${APP_NAME} to stop..." - sleep 1 - counter=$((counter - 1)) - done - fi -} - -# 检测应用服务是否在后台运行中 -appname_is_server_running() { - LOG_D "Check if ${APP_NAME} is running..." - local pid - pid="$(get_pid_from_file '/var/run/${APP_NAME}/${APP_NAME}.pid')" - - if [[ -z "${pid}" ]]; then - false - else - is_service_running "${pid}" - fi -} - -# 清理初始化应用时生成的临时文件 -appname_clean_tmp_file() { - LOG_D "Clean ${APP_NAME} tmp files for init..." - -} - -# 在重新启动容器时,删除标志文件及必须删除的临时文件 (容器重新启动) -appname_clean_from_restart() { - LOG_D "Clean ${APP_NAME} tmp files for restart..." - local -r -a files=( - "/var/run/${APP_NAME}/${APP_NAME}.pid" - ) - - for file in ${files[@]}; do - if [[ -f "$file" ]]; then - LOG_I "Cleaning stale $file file" - rm "$file" - fi - done -} - -# 应用默认初始化操作 -# 执行完毕后,生成文件 ${APP_CONF_DIR}/.app_init_flag 及 ${APP_DATA_DIR}/.data_init_flag 文件 -appname_default_init() { - appname_clean_from_restart - LOG_D "Check init status of ${APP_NAME}..." - - # 检测配置文件是否存在 - if [[ ! -f "${APP_CONF_DIR}/.app_init_flag" ]]; then - LOG_I "No injected configuration file found, creating default config files..." - - # TODO: 生成配置文件,并按照容器运行参数进行相应修改 - - touch "${APP_CONF_DIR}/.app_init_flag" - echo "$(date '+%Y-%m-%d %H:%M:%S') : Init success." >> "${APP_CONF_DIR}/.app_init_flag" - else - LOG_I "User injected custom configuration detected!" - - LOG_D "Update configure files from environment..." - appname_update_conf - fi - - if [[ ! -f "${APP_DATA_DIR}/.data_init_flag" ]]; then - LOG_I "Deploying ${APP_NAME} from scratch..." - - # 启动后台服务 - appname_start_server_bg - - # TODO: 根据需要生成相应初始化数据 - - touch ${APP_DATA_DIR}/.data_init_flag - echo "$(date '+%Y-%m-%d %H:%M:%S') : Init success." >> ${APP_DATA_DIR}/.data_init_flag - else - LOG_I "Deploying ${APP_NAME} with persisted data..." - fi -} - -# 用户自定义的前置初始化操作,依次执行目录 preinitdb.d 中的初始化脚本 -# 执行完毕后,生成文件 ${APP_DATA_DIR}/.custom_preinit_flag -appname_custom_preinit() { - LOG_I "Check custom pre-init status of ${APP_NAME}..." - - # 检测用户配置文件目录是否存在 preinitdb.d 文件夹,如果存在,尝试执行目录中的初始化脚本 - if [ -d "/srv/conf/${APP_NAME}/preinitdb.d" ]; then - # 检测数据存储目录是否存在已初始化标志文件;如果不存在,检索可执行脚本文件并进行初始化操作 - if [[ -n $(find "/srv/conf/${APP_NAME}/preinitdb.d/" -type f -regex ".*\.\(sh\)") ]] && \ - [[ ! -f "${APP_DATA_DIR}/.custom_preinit_flag" ]]; then - LOG_I "Process custom pre-init scripts from /srv/conf/${APP_NAME}/preinitdb.d..." - - # 检索所有可执行脚本,排序后执行 - find "/srv/conf/${APP_NAME}/preinitdb.d/" -type f -regex ".*\.\(sh\)" | sort | process_init_files - - touch "${APP_DATA_DIR}/.custom_preinit_flag" - echo "$(date '+%Y-%m-%d %H:%M:%S') : Init success." >> "${APP_DATA_DIR}/.custom_preinit_flag" - LOG_I "Custom preinit for ${APP_NAME} complete." - else - LOG_I "Custom preinit for ${APP_NAME} already done before, skipping initialization." - fi - fi - - # 检测依赖的服务是否就绪 - #for i in ${SERVICE_PRECONDITION[@]}; do - # appname_wait_service "${i}" - #done -} - -# 用户自定义的应用初始化操作,依次执行目录initdb.d中的初始化脚本 -# 执行完毕后,生成文件 ${APP_DATA_DIR}/.custom_init_flag -appname_custom_init() { - LOG_I "Check custom initdb status of ${APP_NAME}..." - - # 检测用户配置文件目录是否存在 initdb.d 文件夹,如果存在,尝试执行目录中的初始化脚本 - if [ -d "/srv/conf/${APP_NAME}/initdb.d" ]; then - # 检测数据存储目录是否存在已初始化标志文件;如果不存在,检索可执行脚本文件并进行初始化操作 - if [[ -n $(find "/srv/conf/${APP_NAME}/initdb.d/" -type f -regex ".*\.\(sh\|sql\|sql.gz\)") ]] && \ - [[ ! -f "${APP_DATA_DIR}/.custom_init_flag" ]]; then - LOG_I "Process custom init scripts from /srv/conf/${APP_NAME}/initdb.d..." - - # 启动后台服务 - appname_start_server_bg - - # 检索所有可执行脚本,排序后执行 - find "/srv/conf/${APP_NAME}/initdb.d/" -type f -regex ".*\.\(sh\|sql\|sql.gz\)" | sort | while read -r f; do - case "$f" in - *.sh) - if [[ -x "$f" ]]; then - LOG_D "Executing $f"; "$f" - else - LOG_D "Sourcing $f"; . "$f" - fi - ;; - *.sql) - LOG_D "Executing $f"; - postgresql_execute "${PG_DATABASE}" "${PG_INITSCRIPTS_USERNAME}" "${PG_INITSCRIPTS_PASSWORD}" < "$f" - ;; - *.sql.gz) - LOG_D "Executing $f"; - gunzip -c "$f" | postgresql_execute "${PG_DATABASE}" "${PG_INITSCRIPTS_USERNAME}" "${PG_INITSCRIPTS_PASSWORD}" - ;; - *) - LOG_D "Ignoring $f" ;; - esac - done - - touch "${APP_DATA_DIR}/.custom_init_flag" - echo "$(date '+%Y-%m-%d %H:%M:%S') : Init success." >> "${APP_DATA_DIR}/.custom_init_flag" - LOG_I "Custom init for ${APP_NAME} complete." - else - LOG_I "Custom init for ${APP_NAME} already done before, skipping initialization." - fi - fi - -} - diff --git a/alpine/customer/usr/local/bin/comm-env.sh b/alpine/customer/usr/local/bin/comm-env.sh deleted file mode 100644 index c92b32a..0000000 --- a/alpine/customer/usr/local/bin/comm-env.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Ver: 1.0 by Endial Fang (endial@126.com) -# -# 应用环境变量定义及初始化 - -# 通用设置 -export ENV_DEBUG=${ENV_DEBUG:-false} -export ALLOW_ANONYMOUS_LOGIN="${ALLOW_ANONYMOUS_LOGIN:-no}" - -# 通过读取变量名对应的 *_FILE 文件,获取变量值;如果对应文件存在,则通过传入参数设置的变量值会被文件中对应的值覆盖 -# 变量优先级: *_FILE > 传入变量 > 默认值 -app_env_file_lists=( - APP_PASSWORD -) -for env_var in "${app_env_file_lists[@]}"; do - file_env_var="${env_var}_FILE" - if [[ -n "${!file_env_var:-}" ]]; then - export "${env_var}=$(< "${!file_env_var}")" - unset "${file_env_var}" - fi -done -unset postgresql_env_vars - -# 应用路径参数 -export APP_HOME_DIR="/usr/local/${APP_NAME}" -export APP_DEF_DIR="/etc/${APP_NAME}" -export APP_CONF_DIR="/srv/conf/${APP_NAME}" -export APP_DATA_DIR="/srv/data/${APP_NAME}" -export APP_DATA_LOG_DIR="/srv/datalog/${APP_NAME}" -export APP_CACHE_DIR="/var/cache/${APP_NAME}" -export APP_RUN_DIR="/var/run/${APP_NAME}" -export APP_LOG_DIR="/var/log/${APP_NAME}" -export APP_CERT_DIR="/srv/cert/${APP_NAME}" - - -# 应用配置参数 - -# 内部变量 - -# 个性化变量 - diff --git a/alpine/customer/usr/local/bin/entry.sh b/alpine/customer/usr/local/bin/entry.sh deleted file mode 100755 index 9c531c0..0000000 --- a/alpine/customer/usr/local/bin/entry.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# 容器入口脚本 - -# 设置 shell 执行参数,可使用'-'(打开)'+'(关闭)控制。常用: -# -e: 命令执行错误则报错; -u: 变量未定义则报错; -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 -set -eu -set -o pipefail - -. /usr/local/bin/comm-${APP_NAME}.sh # 应用专用函数库 - -. /usr/local/bin/comm-env.sh # 设置环境变量 - -LOG_I "** Processing entry.sh **" - -if ! is_sourced; then - # 替换命令行中的变量 - set -- $(eval echo "$@") - - [ "${1:0:1}" = '-' ] && set -- "${APP_EXEC:-}" "$@" - - print_image_welcome - print_command_help "$@" - - if [ "$1" = "${APP_EXEC}" ] && is_root; then - /usr/local/bin/setup.sh - - LOG_I "Restart with non-root user: ${APP_USER}\n" - exec gosu "${APP_USER}" "$0" "$@" - fi - - [ "$1" = "${APP_EXEC}" ] && /usr/local/bin/init.sh - - LOG_I "Start container with command: $@" - exec tini -- "$@" -fi diff --git a/alpine/customer/usr/local/bin/init.sh b/alpine/customer/usr/local/bin/init.sh deleted file mode 100755 index 1151b4f..0000000 --- a/alpine/customer/usr/local/bin/init.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# 应用初始化脚本 - -# 设置 shell 执行参数,可使用'-'(打开)'+'(关闭)控制。常用: -# -e: 命令执行错误则报错; -u: 变量未定义则报错; -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 -set -eu -set -o pipefail - -. /usr/local/bin/comm-${APP_NAME}.sh # 应用专用函数库 - -. /usr/local/bin/comm-env.sh # 设置环境变量 - -LOG_I "** Processing init.sh **" - -trap "${APP_NAME}_stop_server" EXIT - -# 执行应用预初始化操作 -${APP_NAME}_custom_preinit - -# 执行应用初始化操作 -${APP_NAME}_default_init - -# 执行用户自定义初始化脚本 -${APP_NAME}_custom_init - -LOG_I "** Processing init.sh finished! **" diff --git a/alpine/customer/usr/local/bin/run.sh b/alpine/customer/usr/local/bin/run.sh deleted file mode 100755 index 475b117..0000000 --- a/alpine/customer/usr/local/bin/run.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# 应用启动脚本 - -# 设置 shell 执行参数,可使用'-'(打开)'+'(关闭)控制。常用: -# -e: 命令执行错误则报错; -u: 变量未定义则报错; -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 -set -eu -set -o pipefail - -. /usr/local/bin/comm-${APP_NAME}.sh # 应用专用函数库 - -. /usr/local/bin/comm-env.sh # 设置环境变量 - -LOG_I "** Processing run.sh **" - -flags=("${APP_CONF_FILE:-}") -[[ -z "${APP_EXTRA_FLAGS:-}" ]] || flags=("${flags[@]}" "${APP_EXTRA_FLAGS[@]}") -START_COMMAND=("${APP_EXEC:-/bin/bash}") - -LOG_I "** Starting ${APP_NAME} **" -if is_root; then - exec gosu "${APP_USER}" tini -s -- "${START_COMMAND[@]}" "${flags[@]}" -else - exec tini -s -- "${START_COMMAND[@]}" "${flags[@]}" -fi - diff --git a/alpine/customer/usr/local/bin/setup.sh b/alpine/customer/usr/local/bin/setup.sh deleted file mode 100755 index ac154ca..0000000 --- a/alpine/customer/usr/local/bin/setup.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# 应用环境及依赖文件设置脚本 - -# 设置 shell 执行参数,可使用'-'(打开)'+'(关闭)控制。常用: -# -e: 命令执行错误则报错; -u: 变量未定义则报错; -x: 打印实际待执行的命令行; -o pipefail: 设置管道中命令遇到失败则报错 -set -eu -set -o pipefail - -. /usr/local/bin/comm-${APP_NAME}.sh # 应用专用函数库 - -. /usr/local/bin/comm-env.sh # 设置环境变量 - -LOG_I "** Processing setup.sh **" - -APP_DIRS="${APP_CONF_DIR:-} ${APP_DATA_DIR:-} ${APP_LOG_DIR:-} ${APP_CERT_DIR:-} ${APP_DATA_LOG_DIR:-}" -LOG_I "Ensure directory exists: ${APP_DIRS}" -for dir in ${APP_DIRS}; do - ensure_dir_exists ${dir} -done - -${APP_NAME}_verify_minimum_env - -# 检测指定文件是否在配置文件存储目录存在,如果不存在则拷贝(新挂载数据卷、手动删除都会导致不存在) -LOG_I "Check config files in: ${APP_CONF_DIR}" -if [[ ! -z "$(ls -A "${APP_DEF_DIR}")" ]]; then - ensure_config_file_exist "${APP_DEF_DIR}" $(ls -A "${APP_DEF_DIR}") -fi - -LOG_I "Ensure directory ownership: ${APP_USER}" -for dir in ${APP_DIRS}; do - configure_permissions_ownership "$dir" -u "${APP_USER}" -g "${APP_USER}" -done - -# 解决使用gosu后,nginx: [emerg] open() "/dev/stdout" failed (13: Permission denied) -LOG_D "Change permissions of stdout/stderr to 0622" -chmod 0622 /dev/stdout /dev/stderr - -LOG_I "** Processing setup.sh finished! **" diff --git a/alpine/customer/usr/local/overrides/overrides-x.x.x.sh b/alpine/customer/usr/local/overrides/overrides-x.x.x.sh deleted file mode 100644 index 10401c9..0000000 --- a/alpine/customer/usr/local/overrides/overrides-x.x.x.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -e -# Ver: 1.0 by Endial Fang (endial@126.com) -# -# 在安装完应用后,使用该脚本修改默认配置文件中部分配置项; 如果相应的配置项已经定义为容器环境变量,则不需要在这里修改 - -# 定义要修改的文件 -CONF_FILE="${APP_DEF_DIR}/config/server.properties" - -echo "Process overrides for: ${CONF_FILE}" -#sed -i -E 's/^#?listeners=/d' "${CONF_FILE}" -#sed -i -E 's/^#?log.dirs=\/tmp\/kafka-logs*/log.dirs=\/var\/log\/kafka/g' "${CONF_FILE}" - diff --git a/alpine/customer/usr/sbin/create_user b/alpine/customer/usr/sbin/create_user deleted file mode 100755 index 3958797..0000000 --- a/alpine/customer/usr/sbin/create_user +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# shell 执行参数,分别为 -e(命令执行错误则退出脚本) -u(变量未定义则报错) -x(打印实际待执行的命令行) -set -eux -addgroup -g 998 -S ${APP_USER} -#adduser -G ${APP_USER} -u 999 -s /bin/bash -h /srv/data/${APP_NAME} -D -S ${APP_USER} -adduser -G ${APP_USER} -u 999 -s /usr/sbin/nologin -h /srv/data/${APP_NAME} -D -S ${APP_USER} - -# 如果需要 sudo 权限,需要安装 su 软件包:apk add sudo -#sed -i -e 's/^\sDefaults\s*secure_path\s*=/# Defaults secure_path=/' /etc/sudoers -#echo "${APP_USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers diff --git a/alpine/customer/usr/sbin/prepare_env b/alpine/customer/usr/sbin/prepare_env deleted file mode 100755 index 1b92faa..0000000 --- a/alpine/customer/usr/sbin/prepare_env +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) -# -# shell 执行参数,分别为 -e(命令执行错误则退出脚本) -u(变量未定义则报错) -x(打印实际待执行的命令行) -set -eux - -APP_DIRS=" \ - /usr/local/${APP_NAME} \ - /etc/${APP_NAME} \ - /srv/conf/${APP_NAME} \ - /srv/data/${APP_NAME} \ - /srv/datalog/${APP_NAME} \ - /var/cache/${APP_NAME} \ - /var/run/${APP_NAME} \ - /var/log/${APP_NAME} \ - /srv/cert/${APP_NAME}" - -mkdir -p ${APP_DIRS} -chown -Rf ${APP_USER}:${APP_USER} ${APP_DIRS}; diff --git a/customer/usr/local/bin/run.sh b/customer/usr/local/bin/run.sh index 475b117..5a966ac 100755 --- a/customer/usr/local/bin/run.sh +++ b/customer/usr/local/bin/run.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) +# Ver: 1.2 by Endial Fang (endial@126.com) # # 应用启动脚本 @@ -19,9 +19,5 @@ flags=("${APP_CONF_FILE:-}") START_COMMAND=("${APP_EXEC:-/bin/bash}") LOG_I "** Starting ${APP_NAME} **" -if is_root; then - exec gosu "${APP_USER}" tini -s -- "${START_COMMAND[@]}" "${flags[@]}" -else - exec tini -s -- "${START_COMMAND[@]}" "${flags[@]}" -fi - +LOG_D "Command: ${START_COMMAND[@]} ${flags[@]}" +exec "${START_COMMAND[@]}" "${flags[@]}" diff --git a/customer/usr/local/overrides/overrides-x.x.x.sh b/customer/usr/local/overrides/overrides-x.x.x.sh index 10401c9..c1f8e13 100644 --- a/customer/usr/local/overrides/overrides-x.x.x.sh +++ b/customer/usr/local/overrides/overrides-x.x.x.sh @@ -1,12 +1,11 @@ #!/bin/bash -e -# Ver: 1.0 by Endial Fang (endial@126.com) +# Ver: 1.1 by Endial Fang (endial@126.com) # # 在安装完应用后,使用该脚本修改默认配置文件中部分配置项; 如果相应的配置项已经定义为容器环境变量,则不需要在这里修改 -# 定义要修改的文件 +# 定义要修改的文件(改文件应当是默认配置文件目录中的模板文件) CONF_FILE="${APP_DEF_DIR}/config/server.properties" echo "Process overrides for: ${CONF_FILE}" #sed -i -E 's/^#?listeners=/d' "${CONF_FILE}" #sed -i -E 's/^#?log.dirs=\/tmp\/kafka-logs*/log.dirs=\/var\/log\/kafka/g' "${CONF_FILE}" - diff --git a/customer/usr/sbin/create_user b/customer/usr/sbin/create_user index 7b69b93..d763916 100755 --- a/customer/usr/sbin/create_user +++ b/customer/usr/sbin/create_user @@ -1,5 +1,5 @@ #!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) +# Ver: 1.2 by Endial Fang (endial@126.com) # # shell 执行参数,分别为 -e(命令执行错误则退出脚本) -u(变量未定义则报错) -x(打印实际待执行的命令行) set -eux @@ -7,6 +7,6 @@ groupadd --gid 998 --system ${APP_USER} #useradd --gid 998 --uid 999 --shell /bin/bash --home /srv/data/${APP_NAME} --system ${APP_USER} useradd --gid 998 --uid 999 --shell /usr/sbin/nologin --home /srv/data/${APP_NAME} --system ${APP_USER} -# 如果需要 sudo 权限,需要安装 su 软件包:apk add sudo +# 如果需要 sudo 权限,需要在 Dockerfile 中安装 su 软件包:RUN install_pkg sudo #sed -i -e 's/^\sDefaults\s*secure_path\s*=/# Defaults secure_path=/' /etc/sudoers #echo "${APP_USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers diff --git a/customer/usr/sbin/prepare_env b/customer/usr/sbin/prepare_env index 1b92faa..8ca5add 100755 --- a/customer/usr/sbin/prepare_env +++ b/customer/usr/sbin/prepare_env @@ -1,5 +1,5 @@ #!/bin/bash -# Ver: 1.1 by Endial Fang (endial@126.com) +# Ver: 1.2 by Endial Fang (endial@126.com) # # shell 执行参数,分别为 -e(命令执行错误则退出脚本) -u(变量未定义则报错) -x(打印实际待执行的命令行) set -eux @@ -16,4 +16,4 @@ APP_DIRS=" \ /srv/cert/${APP_NAME}" mkdir -p ${APP_DIRS} -chown -Rf ${APP_USER}:${APP_USER} ${APP_DIRS}; +chown -Rf ${APP_USER}:${APP_USER} ${APP_DIRS} diff --git a/docker-compose-cluster.yml b/docker-compose-cluster.yml index a9a5523..8f0f615 100644 --- a/docker-compose-cluster.yml +++ b/docker-compose-cluster.yml @@ -1,20 +1,19 @@ version: '3.8' -# 可以使用 scale 动态扩容容器:docker-compose scale app-name=3 - +# Docker-Compose 方式启动容器集群的 YAML 配置文件 +# 当前配置仅保证可以启动容器;更多配置参数请参考镜像 README.md 文档中说明 services: app1-name: - image: 'colovu/app1-name' - restart: always + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/app-name' ports: - - '8000:8000' + - '8001:8000' environment: - ALLOW_ANONYMOUS_LOGIN=yes app2-name: - image: 'colovu/app2-name' + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/app-name' ports: - - '8080' + - '8002:8000' environment: - ALLOW_ANONYMOUS_LOGIN=yes volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 4d1dae3..796c31f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.8' -# Docker-Compose 单容器使用参考 YAML 配置文件 -# 更多配置参数请参考镜像 README.md 文档中说明 +# Docker-Compose 方式启动容器的 YAML 配置文件 +# 当前配置仅保证可以启动容器;更多配置参数请参考镜像 README.md 文档中说明 services: app-name: image: 'registry.cn-shenzhen.aliyuncs.com/colovu/app-name' @@ -10,7 +10,6 @@ services: volumes: - 'app_conf:/srv/conf' environment: - # ALLOW_ANONYMOUS_LOGIN is recommended only for development. - ALLOW_ANONYMOUS_LOGIN=yes - ENV_DEBUG=yes