-
-
Save huobazi/5c65e8b4ac44a51a6e165d627cc0e64c to your computer and use it in GitHub Desktop.
Bash script to configure, start and stop single node MinIO container instance on Docker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# -------------------------------------------------------------------- | |
# [init] Create run dir, env file if they don't exist, then source env | |
# -------------------------------------------------------------------- | |
init() { | |
MINIO_CONTAINER_NAME=$1 | |
MINIO_RUN_DIR=/data1/run/${MINIO_CONTAINER_NAME} | |
MINIO_DATA=${MINIO_RUN_DIR}/data | |
MINIO_CERTS=${MINIO_RUN_DIR}/certs | |
# create run dir for container instance | |
if [ ! -d "${MINIO_RUN_DIR}" ]; then | |
echo "Creating MinIO run dir: ${MINIO_RUN_DIR}" | |
mkdir -p ${MINIO_DATA} | |
mkdir -p ${MINIO_CERTS} | |
fi | |
# create .env file for container instance | |
if [ ! -f ${MINIO_RUN_DIR}/minio.env ]; then | |
echo "Creating ${MINIO_RUN_DIR}/minio.env file." | |
cat <<-ENV_FILE > ${MINIO_RUN_DIR}/minio.env | |
MINIO_HOST_NAME=${MINIO_HOST_NAME:-localhost} | |
MINIO_PORT=${MINIO_PORT:-9000} | |
MINIO_CONSOLE_PORT=${MINIO_CONSOLE_PORT:-9001} | |
MINIO_CONTAINER_NAME=${MINIO_CONTAINER_NAME} | |
MINIO_DATA=${MINIO_DATA} | |
MINIO_CERTS=${MINIO_CERTS} | |
MINIO_USERNAME=${MINIO_USERNAME:-minioadmin} | |
MINIO_PASSWORD=${MINIO_PASSWORD:-$(openssl rand -base64 9)} | |
ENV_FILE | |
fi | |
# hydrate env | |
source ${MINIO_RUN_DIR}/minio.env 2>/dev/null | |
} | |
# -------------------------------------------------------------------- | |
# [certs] Generate self-signed cert to enable TLS for minio server | |
# -------------------------------------------------------------------- | |
certs() { | |
openssl req -new -newkey rsa:4096 \ | |
-days 365 -nodes -x509 \ | |
-subj "/CN=${MINIO_HOST_NAME}" \ | |
-addext "subjectAltName = DNS:${MINIO_HOST_NAME}" \ | |
-keyout ${MINIO_RUN_DIR}/certs/private.key \ | |
-out ${MINIO_RUN_DIR}/certs/public.crt 2>/dev/null | |
} | |
# ------------------------------------------------------------------- | |
# [run] Start container if it exists otherwise start new container | |
# ------------------------------------------------------------------- | |
run() { | |
# Do nothing if container is aleady running | |
if [ $(docker ps -aq -f status=running -f name=${MINIO_CONTAINER_NAME}) ]; then | |
echo "Container ${MINIO_CONTAINER_NAME} is already running." | |
return | |
fi | |
# Start stopped container | |
if [ $(docker ps -aq -f status=exited -f name=${MINIO_CONTAINER_NAME}) ]; then | |
echo "Starting existing container ${MINIO_CONTAINER_NAME}..." | |
docker start ${MINIO_CONTAINER_NAME} | |
return | |
fi | |
# Generate certs for minio server | |
echo "Generating certs for ${MINIO_CONTAINER_NAME}" | |
certs ${MINIO_CONTAINER_NAME} | |
# Start new container | |
echo "Starting new container ${MINIO_CONTAINER_NAME} ${MINIO_USERNAME}:${MINIO_PASSWORD}" | |
docker run -d \ | |
-p ${MINIO_PORT}:${MINIO_PORT} \ | |
-p ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT} \ | |
--user $(id -u):$(id -g) \ | |
--name ${MINIO_CONTAINER_NAME} \ | |
-e MINIO_ROOT_USER=${MINIO_USERNAME} \ | |
-e MINIO_ROOT_PASSWORD=${MINIO_PASSWORD} \ | |
-e MINIO_SERVER_URL=https://${MINIO_HOST_NAME}:${MINIO_PORT} \ | |
-v ${MINIO_DATA}:/data \ | |
-v ${MINIO_CERTS}:/run/certs \ | |
minio/minio server /data \ | |
--console-address ":${MINIO_CONSOLE_PORT}" \ | |
--certs-dir "/run/certs/" | |
} | |
# ------------------------------------------------------------------- | |
# [stop] Stop MinIO container | |
# ------------------------------------------------------------------- | |
stop() { | |
docker container stop ${MINIO_CONTAINER_NAME} | |
} | |
# ------------------------------------------------------------------- | |
# [status] Docker stats | |
# ------------------------------------------------------------------- | |
status() { | |
docker container stats --no-stream ${MINIO_CONTAINER_NAME} | |
} | |
# ------------------------------------------------------------------- | |
# [clean] Stop and remove MinIO container. | |
# ------------------------------------------------------------------- | |
clean() { | |
docker container rm --force ${MINIO_CONTAINER_NAME} 2>/dev/null | |
} | |
# ------------------------------------------------------------------- | |
# [usage] Print script usage. | |
# ------------------------------------------------------------------- | |
usage() { | |
echo "----------------------------------------------------" | |
echo "Usage: $0 {run|stop|status|clean} NAME" | |
echo "----------------------------------------------------" | |
echo " $0 run my-minio-server" | |
echo " $0 stop my-minio-server" | |
echo " $0 status my-minio-server" | |
echo " $0 clean my-minio-server" | |
echo "----------------------------------------------------" | |
} | |
# ------------------------------------------------------------------- | |
# [main] - init and flow | |
# ------------------------------------------------------------------- | |
main() { | |
if [ $# -lt 2 ]; then | |
usage | |
exit 1 | |
fi | |
init $2 | |
case "$1" in | |
run) run $2 ;; | |
stop) stop $2 ;; | |
status) status $2 ;; | |
clean) clean $2 ;; | |
*) | |
usage | |
exit 1 | |
esac | |
} | |
# ------------------------------------------------------------------- | |
# ENTRYPOINT | |
# ------------------------------------------------------------------- | |
main $@ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment