diff --git a/alpine/Dockerfile-3.12 b/alpine/Dockerfile-3.12 index f6e3033..e42668a 100644 --- a/alpine/Dockerfile-3.12 +++ b/alpine/Dockerfile-3.12 @@ -1,8 +1,8 @@ FROM alpine:3.12 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/ /etc/ -RUN echo -e 'https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.12/main\n\ -https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.12/community\n\ +RUN echo -e 'https://mirrors.nju.edu.cn/alpine/v3.12/main\n\ +https://mirrors.nju.edu.cn/alpine/v3.12/community\n\ ' > /etc/apk/repositories \ && apk update \ && apk add --no-cache bash curl coreutils iproute2 \ diff --git a/alpine/Dockerfile-3.15 b/alpine/Dockerfile-3.15 index 026959b..eedef51 100644 --- a/alpine/Dockerfile-3.15 +++ b/alpine/Dockerfile-3.15 @@ -1,8 +1,8 @@ FROM alpine:3.15 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/ /etc/ -RUN echo -e 'https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.15/main\n\ -https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.15/community\n\ +RUN echo -e 'https://mirrors.nju.edu.cn/alpine/v3.15/main\n\ +https://mirrors.nju.edu.cn/alpine/v3.15/community\n\ ' > /etc/apk/repositories \ && apk update \ && apk add --no-cache bash curl coreutils iproute2 \ diff --git a/alpine/Dockerfile-3.17 b/alpine/Dockerfile-3.17 index e666628..b83782a 100644 --- a/alpine/Dockerfile-3.17 +++ b/alpine/Dockerfile-3.17 @@ -1,8 +1,8 @@ FROM alpine:3.17 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/ /etc/ -RUN echo -e 'https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.17/main\n\ -https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.17/community\n\ +RUN echo -e 'https://mirrors.nju.edu.cn/alpine/v3.17/main\n\ +https://mirrors.nju.edu.cn/alpine/v3.17/community\n\ ' > /etc/apk/repositories \ && apk update \ && apk add --no-cache bash curl coreutils iproute2 \ diff --git a/alpine/Dockerfile-3.20 b/alpine/Dockerfile-3.20 index 67758e8..1a4c341 100644 --- a/alpine/Dockerfile-3.20 +++ b/alpine/Dockerfile-3.20 @@ -1,8 +1,8 @@ FROM alpine:3.20 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/ /etc/ -RUN echo -e 'https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/main\n\ -https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.20/community\n\ +RUN echo -e 'https://mirrors.nju.edu.cn/alpine/v3.20/main\n\ +https://mirrors.nju.edu.cn/alpine/v3.20/community\n\ ' > /etc/apk/repositories \ && apk update \ && apk add --no-cache bash curl coreutils iproute2 \ diff --git a/alpine/Dockerfile-3.9 b/alpine/Dockerfile-3.9 new file mode 100644 index 0000000..4f7948b --- /dev/null +++ b/alpine/Dockerfile-3.9 @@ -0,0 +1,14 @@ +FROM alpine:3.9 +MAINTAINER Colben colbenlee@gmail.com +ADD --chown=root:root /ADD/ /etc/ +RUN echo -e 'https://mirrors.nju.edu.cn/alpine/v3.9/main\n\ +https://mirrors.nju.edu.cn/alpine/v3.9/community\n\ +' > /etc/apk/repositories \ + && apk update \ + && apk add --no-cache bash curl coreutils iproute2 \ + && echo "alias ls='ls --color=auto'" >> /root/.bashrc \ + && rm -rf /var/cache/apk/* +ENV PS1='\[\e[33;1;1m\][\[\e[0m\]\[\e[35;1m\]\u\[\e[0m\]\[\e[33;1;1m\]@\[\e[0m\]\[\e[31;1;1m\]docker\[\e[0m\]\[\e[32;1;1m\](\h)\[\e[0m\]\[\e[33;1;1m\]:\[\e[0m\]\[\e[32m\]\w\[\e[0m\]\[\e[33;1;1m\]]\[\e[0m\]\[\e[36m\]\$\[\e[0m\] ' +ENV PS2='\[\e[36m\]>\[\e[0m\] ' +ENV LANG=en_US.UTF-8 + diff --git a/greatsql/ADD/ccmd b/greatsql/ADD/ccmd index ecb5abe..d1bead2 100755 --- a/greatsql/ADD/ccmd +++ b/greatsql/ADD/ccmd @@ -47,7 +47,7 @@ function Init { && THP_SETTING=never \ || Print Failed to disable THP, consider privileged container. rm -f ${SOCK_FILE}* ${PID_FILE} - chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR + chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR $(dirname $SOCK_FILE) chmod 0750 $LOG_DIR if [ ! -d "$DATA_DIR/mysql" ]; then Print Initing greatsql db files ... diff --git a/mariadb/ADD/ccmd b/mariadb/ADD/ccmd index feb3be4..ac78a62 100755 --- a/mariadb/ADD/ccmd +++ b/mariadb/ADD/ccmd @@ -41,7 +41,7 @@ function Quit { function Init { rm -f $SOCK_FILE $PID_FILE - chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR + chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR $(dirname $SOCK_FILE) if [ ! -d "$DATA_DIR/mysql" ]; then Print Initing mysql db files ... mysql_install_db --user=mysql > /dev/null diff --git a/mariadb/Dockerfile-10.11 b/mariadb/Dockerfile-10.11 new file mode 100644 index 0000000..4d34691 --- /dev/null +++ b/mariadb/Dockerfile-10.11 @@ -0,0 +1,32 @@ +ARG ARCH +FROM harbor.colben.cn/general/alpine$ARCH:3.20 +MAINTAINER Colben colbenlee@gmail.com +ADD --chown=root:root /ADD/ /opt/ +RUN apk update \ + && apk add --no-cache mariadb mariadb-client mariadb-backup \ + && rm -rf /var/cache/apk/* /etc/my.cnf* \ + && mkdir -p /etc/mysql \ + && echo -e '[mysqld]\n'> /etc/my.cnf \ + && echo -e '[client]\n\ +socket = /run/mysqld/mysqld.sock\n\ +\n\ +[server]\n\ +datadir = /var/lib/mysql\n\ +socket = /run/mysqld/mysqld.sock\n\ +pid-file = /run/mysqld/mysqld.pid\n\ +log-error = /var/log/mysql/error.log\n\ +character-set-server = utf8mb4\n\ +default-storage-engine = innodb\n\ +slow-query-log = TRUE\n\ +slow-query-log-file = /var/log/mysql/slow.log\n\ +lower-case-table-names = 1\n\ +\n\ +[mysqladmin]\n\ +user = docker\n\ +password = China_19$(10)!\n\ +' > /etc/mysql/my.cnf \ + && sed -i 's/stty/#stty/' /usr/bin/mysql_secure_installation \ + && mkdir -p /var/log/mysql /var/lib/mysql-bin /run/mysqld \ + && chown -R mysql:mysql /var/log/mysql /var/lib/mysql-bin /run/mysqld +CMD ["/opt/ccmd"] + diff --git a/mariadb/Dockerfile-10.6 b/mariadb/Dockerfile-10.6 index 68b0492..4af4019 100644 --- a/mariadb/Dockerfile-10.6 +++ b/mariadb/Dockerfile-10.6 @@ -3,7 +3,7 @@ FROM harbor.colben.cn/general/alpine$ARCH:3.17 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/ /opt/ RUN apk update \ - && apk add --no-cache mariadb mariadb-client \ + && apk add --no-cache mariadb mariadb-client mariadb-backup \ && rm -rf /var/cache/apk/* /etc/my.cnf* /etc/mysql/* \ && echo -e '[mysqld]\n'> /etc/my.cnf \ && echo -e '[client]\n\ diff --git a/mysql/ADD/ccmd b/mysql/ADD/ccmd index 379c5ef..2b497a3 100755 --- a/mysql/ADD/ccmd +++ b/mysql/ADD/ccmd @@ -41,7 +41,7 @@ function Quit { function Init { rm -f ${SOCK_FILE}* $PID_FILE - chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR + chown -R mysql:mysql $LOG_DIR $BINLOG_DIR $DATA_DIR $(dirname $SOCK_FILE) if [ ! -d "$DATA_DIR/mysql" ]; then Print Initing mysql db files ... mysqld_pre_systemd diff --git a/mysql/Dockerfile-8 b/mysql/Dockerfile-8 index 213064b..59fc8f4 100644 --- a/mysql/Dockerfile-8 +++ b/mysql/Dockerfile-8 @@ -3,17 +3,16 @@ FROM harbor.colben.cn/general/rocky$ARCH:8 MAINTAINER Colben colbenlee@gmail.com ARG ARCH ADD --chown=root:root /ADD/ /opt/ -RUN echo -e "[mysql80-community]\n\ -name=MySQL 8.0 Community Server\n\ -baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/8/\$basearch/\n\ +RUN echo -e "[mysql-8.4-lts-community]\n\ +name=MySQL 8.4 LTS Community Server\n\ +baseurl=https://repo.mysql.com/yum/mysql-8.4-community/el/8/\$basearch/\n\ enabled=1\n\ gpgcheck=0\n\ -" > /etc/yum.repos.d/mysql-8.0.repo \ +" > /etc/yum.repos.d/mysql-8.4.repo \ && microdnf makecache \ && microdnf module disable mysql \ && microdnf install mysql-community-server \ - && rm -rf /usr/sbin/mysqld-debug \ - /var/cache/yum \ + && rm -rf /var/cache/yum \ /var/lib/dnf \ /var/log/* \ /etc/my.cnf.d \ @@ -41,7 +40,7 @@ character-set-server = utf8mb4\n\ default-storage-engine = innodb\n\ slow-query-log = TRUE\n\ slow-query-log-file = /var/log/mysql/slow.log\n\ -authentication-policy = mysql_native_password\n\ +mysql-native-password = ON\n\ lower-case-table-names = 1\n\ \n\ [mysqladmin]\n\ diff --git a/nginx-php/README.md b/nginx-php/README.md index ffa0a74..7777ff1 100644 --- a/nginx-php/README.md +++ b/nginx-php/README.md @@ -11,7 +11,7 @@ - /var/lib/nginx/html: nginx 前端文件存放目录 - /var/log/nginx: nginx 日志目录 - /var/log/php7: php7 日志目录 -- /var/log/php81: php7 日志目录 +- /var/log/php81: php8 日志目录 ## 案例 - [Demo/SingleNode/](Demo/SingleNode/): 部署 nginx-php diff --git a/php/ADD-7.2/ccmd b/php/ADD-7.2/ccmd new file mode 100755 index 0000000..b785037 --- /dev/null +++ b/php/ADD-7.2/ccmd @@ -0,0 +1,51 @@ +#!/bin/bash + +################################################## +# Mount dir # +# - /var/log/php7 # +################################################## + +set -euo pipefail +export LANG=en_US.UTF-8 +trap Quit EXIT + +PIDS= +GOT_SIGTERM= + +function Print { + local file=/dev/null + [ '-f' = "$1" ] && file=$2 && shift && shift + date +"[%F %T] $*" | tee -a $file +} + +function Quit { + Print killing php ... + while :; do + pkill -f php-fpm7 && Print killing php-fpm7 ... || break + sleep 2 + done + Print Container stopped. + test -n "$GOT_SIGTERM" +} + +function StartProc { + Print Start php ... + php-fpm7 -F -y /etc/php7/php-fpm.conf & + PIDS="$PIDS $!" + Print PHP started. +} + +function Main { + local pid= + StartProc + trap "GOT_SIGTERM=1; Print Got SIGTERM ..." SIGTERM + while [ -z "$GOT_SIGTERM" ] && sleep 2; do + for pid in $PIDS; do + [ ! -e /proc/$pid ] && Print Unexpected error! && exit + done + done +} + +# Start here +Main + diff --git a/php/Dockerfile-7.2 b/php/Dockerfile-7.2 new file mode 100644 index 0000000..f8cb8d2 --- /dev/null +++ b/php/Dockerfile-7.2 @@ -0,0 +1,26 @@ +ARG ARCH +FROM harbor.colben.cn/general/alpine$ARCH:3.9 +MAINTAINER Colben colbenlee@gmail.com +ADD --chown=root:root /ADD-7.2/ /opt/ +RUN sed -i '/edge/d' /etc/apk/repositories \ + && apk update \ + && apk add --no-cache php7 php7-common php7-iconv php7-json php7-gd php7-curl php7-xml \ + php7-mysqli php7-imap php7-cgi fcgi php7-pdo php7-pdo_mysql php7-soap php7-xmlrpc \ + php7-posix php7-mcrypt php7-gettext php7-ldap php7-ctype php7-dom php7-fpm \ + php7-mbstring php7-mysqlnd php7-bcmath php7-session php7-openssl php7-opcache composer \ + && sed -i -e '/^;* *max_execution_time *=/cmax_execution_time = 300' \ + -e '/^;* *memory_limit *=/cmemory_limit = 1024M' \ + -e '/^;* *post_max_size *=/cpost_max_size = 1024M' \ + -e '/^;* *upload_max_filesize *=/cupload_max_filesize = 1024M' \ + -e '/^;* *max_input_time *=/cmax_input_time = 300' \ + -e '/^;* *max_input_vars *=/cmax_input_vars = 10000' \ + -e '/^;* *date.timezone *=/cdate.timezone = PRC' \ + -e '/^;* *pdo_mysql.default_socket *=/cpdo_mysql.default_socket = /run/mysqld/mysqld.sock' \ + -e '/^;* *mysqli.default_socket *=/cmysqli.default_socket = /run/mysqld/mysqld.sock' \ + /etc/php7/php.ini \ + && sed -i -e '/^;* *listen *=/clisten = /var/lib/php7/phpfpm.sock' \ + -e '/^;* *listen.mode *=/clisten.mode = 0666' \ + /etc/php7/php-fpm.d/www.conf \ + && rm -rf /var/cache/apk/* +CMD ["/opt/ccmd"] + diff --git a/php/README.md b/php/README.md new file mode 100644 index 0000000..4a00107 --- /dev/null +++ b/php/README.md @@ -0,0 +1,10 @@ +# 构建 php 镜像 + +## 定制 +- 安装 php +- 修改一些常用配置 + +## 外挂目录和文件 +- /var/log/php7: php7 日志目录 +- /var/log/php81: php8 日志目录 + diff --git a/php/php.sh b/php/php.sh new file mode 100755 index 0000000..d3a3837 --- /dev/null +++ b/php/php.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +#========================================= +# Author : colben +#========================================= + +set -euo pipefail +export LANG=en_US.UTF-8 + +[ 'x86_64' == "$(uname -m)" ] && ARCH='' || ARCH="-$(uname -m)" +ROOT_DIR="$(cd $(dirname $0) && pwd)" +TAG=$1 +IMAGE="harbor.colben.cn/general/$(basename ${0%.sh})$ARCH:$TAG" + +if [ -t 0 ]; then + function Print { echo -e "\033[36;1m$(date +'[%F %T]')\033[32;1m $*\033[0m"; } + function Warn { echo -e "\033[36;1m$(date +'[%F %T]')\033[33;1m $*\033[0m"; } + function Error { echo -e "\033[36;1m$(date +'[%F %T]')\033[31;1m $*\033[0m"; exit 1; } +else + function Print { echo -e "$(date +'[%F %T INFO]') $*"; } + function Warn { echo -e "$(date +'[%F %T WARN]') $*"; } + function Error { echo -e "$(date +'[%F %T ERROR]') $*"; exit 1; } +fi + +function Quit { + local exitCode=$? + [ 0 -ne $exitCode ] && Error Failed to build or push image! + [ -z "${END:-}" ] && echo && Error Interrupted manually! + Print Succeeded to build and push image. +} + +function YesOrNo { + Warn $* + local sw= + while :; do + read -p '(Yes/No/Quit) ' -n1 sw + [[ "$sw" =~ ^Y|y$ ]] && echo && return 0 + [[ "$sw" =~ ^N|n$ ]] && echo && return 1 + [[ "$sw" =~ ^Q|q$ ]] && echo && exit 0 + [ -n "$sw" ] && echo + done +} + +function Update { + : +} + +function Build { + local yn + cd $ROOT_DIR + docker images --format='{{.Repository}}:{{.Tag}}' | grep "^$IMAGE$" \ + && Warn Removing image $IMAGE ... \ + && docker rmi $IMAGE + Warn Building image: $IMAGE ... + docker build --force-rm --build-arg ARCH="$ARCH" -t $IMAGE -f Dockerfile-$TAG . + YesOrNo Push image: $IMAGE? && docker push $IMAGE +} + +function Main { + trap Quit EXIT + Update + Build + END=1 +} + +# Start here +Main + diff --git a/rocky-python/Dockerfile-3.11 b/rocky-python/Dockerfile-3.11 index a43c4c3..7140ad3 100644 --- a/rocky-python/Dockerfile-3.11 +++ b/rocky-python/Dockerfile-3.11 @@ -2,6 +2,6 @@ ARG ARCH FROM harbor.colben.cn/general/rocky$ARCH:8 MAINTAINER Colben colbenlee@gmail.com RUN microdnf makecache \ - && microdnf install gcc gcc-c++ make cmake python3.11-pip python3.11-devel mysql-devel \ + && microdnf install gcc gcc-c++ make cmake python3.11-pip python3.11-devel \ && rm -rf /var/cache/yum /var/lib/dnf diff --git a/rocky-python/Dockerfile-3.12 b/rocky-python/Dockerfile-3.12 new file mode 100644 index 0000000..21b8899 --- /dev/null +++ b/rocky-python/Dockerfile-3.12 @@ -0,0 +1,7 @@ +ARG ARCH +FROM harbor.colben.cn/general/rocky$ARCH:8 +MAINTAINER Colben colbenlee@gmail.com +RUN microdnf makecache \ + && microdnf install gcc gcc-c++ make cmake python3.12-pip python3.12-devel \ + && rm -rf /var/cache/yum /var/lib/dnf + diff --git a/ubuntu-python/Dockerfile-22.04 b/ubuntu-python/Dockerfile-22.04 new file mode 100644 index 0000000..e69e16d --- /dev/null +++ b/ubuntu-python/Dockerfile-22.04 @@ -0,0 +1,7 @@ +ARG ARCH +FROM harbor.colben.cn/general/ubuntu$ARCH:22.04 +MAINTAINER Colben colbenlee@gmail.com +RUN apt update \ + && apt -y install build-essential python3-pip python3-dev \ + && rm -rf /var/lib/apt/lists/* /var/lib/dpkg/info/* /var/cache/apt/archives + diff --git a/ubuntu-python/README.md b/ubuntu-python/README.md new file mode 100644 index 0000000..0dc47df --- /dev/null +++ b/ubuntu-python/README.md @@ -0,0 +1,5 @@ +# 构建 python 镜像 + +## 定制 +- 安装 python3 及其编译工具 + diff --git a/ubuntu-python/ubuntu-python.sh b/ubuntu-python/ubuntu-python.sh new file mode 100755 index 0000000..d3a3837 --- /dev/null +++ b/ubuntu-python/ubuntu-python.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +#========================================= +# Author : colben +#========================================= + +set -euo pipefail +export LANG=en_US.UTF-8 + +[ 'x86_64' == "$(uname -m)" ] && ARCH='' || ARCH="-$(uname -m)" +ROOT_DIR="$(cd $(dirname $0) && pwd)" +TAG=$1 +IMAGE="harbor.colben.cn/general/$(basename ${0%.sh})$ARCH:$TAG" + +if [ -t 0 ]; then + function Print { echo -e "\033[36;1m$(date +'[%F %T]')\033[32;1m $*\033[0m"; } + function Warn { echo -e "\033[36;1m$(date +'[%F %T]')\033[33;1m $*\033[0m"; } + function Error { echo -e "\033[36;1m$(date +'[%F %T]')\033[31;1m $*\033[0m"; exit 1; } +else + function Print { echo -e "$(date +'[%F %T INFO]') $*"; } + function Warn { echo -e "$(date +'[%F %T WARN]') $*"; } + function Error { echo -e "$(date +'[%F %T ERROR]') $*"; exit 1; } +fi + +function Quit { + local exitCode=$? + [ 0 -ne $exitCode ] && Error Failed to build or push image! + [ -z "${END:-}" ] && echo && Error Interrupted manually! + Print Succeeded to build and push image. +} + +function YesOrNo { + Warn $* + local sw= + while :; do + read -p '(Yes/No/Quit) ' -n1 sw + [[ "$sw" =~ ^Y|y$ ]] && echo && return 0 + [[ "$sw" =~ ^N|n$ ]] && echo && return 1 + [[ "$sw" =~ ^Q|q$ ]] && echo && exit 0 + [ -n "$sw" ] && echo + done +} + +function Update { + : +} + +function Build { + local yn + cd $ROOT_DIR + docker images --format='{{.Repository}}:{{.Tag}}' | grep "^$IMAGE$" \ + && Warn Removing image $IMAGE ... \ + && docker rmi $IMAGE + Warn Building image: $IMAGE ... + docker build --force-rm --build-arg ARCH="$ARCH" -t $IMAGE -f Dockerfile-$TAG . + YesOrNo Push image: $IMAGE? && docker push $IMAGE +} + +function Main { + trap Quit EXIT + Update + Build + END=1 +} + +# Start here +Main + diff --git a/ubuntu/Dockerfile b/ubuntu/Dockerfile-22.04 similarity index 87% rename from ubuntu/Dockerfile rename to ubuntu/Dockerfile-22.04 index e27a617..b8653a0 100644 --- a/ubuntu/Dockerfile +++ b/ubuntu/Dockerfile-22.04 @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 MAINTAINER Colben colbenlee@gmail.com ADD --chown=root:root /ADD/localtime /etc/localtime ENV LANG=en_US.UTF-8 @@ -16,7 +16,7 @@ alias grep='grep --color=auto'\n\ && ln -sf /bin/bash /bin/sh \ && apt update -y \ && apt install -y ca-certificates \ - && sed -i '/^deb /s,http://ports.ubuntu.com,https://mirrors.tuna.tsinghua.edu.cn,' /etc/apt/sources.list \ + && sed -i '/^deb /s,http://archive.ubuntu.com,https://mirrors.tuna.tsinghua.edu.cn,' /etc/apt/sources.list \ && apt update -y \ && apt install -y vim-tiny less curl iproute2 \ && rm -rf /var/lib/apt/lists/* /var/lib/dpkg/info/* /var/cache/apt/archives /root/.bashrc /root/.profile diff --git a/ubuntu/ubuntu.sh b/ubuntu/ubuntu.sh index 4504afc..2ff4781 100755 --- a/ubuntu/ubuntu.sh +++ b/ubuntu/ubuntu.sh @@ -9,7 +9,8 @@ export LANG=en_US.UTF-8 [ 'x86_64' == "$(uname -m)" ] && ARCH='' || ARCH="-$(uname -m)" ROOT_DIR="$(cd $(dirname $0) && pwd)" -IMAGE="harbor.colben.cn/general/$(basename ${0%.sh})$ARCH:20" +TAG=$1 +IMAGE="harbor.colben.cn/general/$(basename ${0%.sh})$ARCH:$TAG" if [ -t 0 ]; then function Print { echo -e "\033[36;1m$(date +'[%F %T]')\033[32;1m $*\033[0m"; } @@ -53,7 +54,7 @@ function Build { && Warn Removing image $IMAGE ... \ && docker rmi $IMAGE Warn Building image: $IMAGE ... - docker build --force-rm -t $IMAGE . + docker build --force-rm -t $IMAGE -f Dockerfile-$TAG . YesOrNo Push image: $IMAGE? && docker push $IMAGE }