#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/auto" || exit 1 function display_help() { uecho "$scriptname: outil pour faciliter l'utilisation de docker USAGE $scriptname CMDs... COMMANDES build run up logs down brd ps ls rm prune" } function get_version() { local GIT_DIR; unset GIT_DIR if git rev-parse --git-dir >/dev/null 2>&1; then local head commit tag commit="$(git rev-list --tags --max-count=1 2>/dev/null)" if [ -n "$commit" ]; then tag="$(git describe --tags "$commit" 2>/dev/null)" if [ -n "$tag" ]; then head="$(git rev-parse HEAD)" if [ "$commit" != "$head" ]; then echo "$tag-develop" else echo "$tag" fi return fi fi elif [ -f VERSION.txt ]; then cat VERSION.txt fi echo develop } function docker_add_build_arg() { eval "replace_build_args+=(--build-arg $1=\"$2\"); $1=\"$2\"" } function docker_parse_build_args() { cat "$1" | grep -v '^#' | grep -v '^$' | sed -r 's/([^=]+)=(.*)/replace_build_args+=(--build-arg \1="\2"); \1="\2"/' } function docker_parse_env_args() { [ -f .build.env ] && eval "$(docker_parse_build_args .build.env)" [ -f build.env ] && eval "$(docker_parse_build_args build.env)" [ -n "$profile" -a -f ".build.$profile.env" ] && eval "$(docker_parse_build_args ".build.$profile.env")" } function docker_set_env_args() { [ -f .build.env ] && source ./.build.env [ -f build.env ] && source ./build.env [ -n "$profile" -a -f ".build.$profile.env" ] && source "./.build.$profile.env" } function docker_set_run_args() { replace_run_args+=(--env-file "$1") source "$1" } function docker_check_name() { [ -n "$NAME" ] || die "Vous devez définir NAME dans .build.env" if [ "$1" == set_name ]; then name="${NAME//[^a-zA-Z0-9_.-]/_}" fi } function compose_set_env_args() { replace_env_args+=(-f docker-compose.yml) if [ -f docker-compose.override.yml ]; then replace_env_args+=(-f docker-compose.override.yml) fi if [ -n "$profile" -a -f "docker-compose.$profile.yml" ]; then replace_env_args+=(-f "docker-compose.$profile.yml") fi } function default_compose_build() { docker-compose \ "${replace_env_args[@]}" "${env_args[@]}" \ build "${replace_build_args[@]}" "${build_args[@]}" \ "$@" } function default_docker_build() { [ -n "$VERSION" ] || docker_add_build_arg VERSION "$(get_version)" replace_build_args+=(-t "$NAME:$VERSION" -t "$NAME:latest") docker build \ "${replace_env_args[@]}" "${env_args[@]}" \ "${replace_build_args[@]}" "${build_args[@]}" \ "$@" "$CTXDIR" } function compose_build() { default_compose_build "$@"; } function docker_build() { default_docker_build "$@"; } function auto_build() { local -a replace_env_args env_args local -a replace_build_args build_args CTXDIR=. NAME= VERSION= if [ -f docker-compose.yml ]; then compose_set_env_args compose_build else docker_parse_env_args docker_check_name docker_add_build_arg build_date "$(date +%y%m%d)" docker_build fi } function default_compose_up() { docker-compose \ "${replace_env_args[@]}" "${env_args[@]}" \ up "${replace_run_args[@]}" "${run_args[@]}" \ "${replace_user_args[@]}" "${user_args[@]}" "$@" } function default_docker_up() { docker run \ "${replace_env_args[@]}" "${env_args[@]}" \ "${replace_run_args[@]}" "${run_args[@]}" \ "$NAME" \ "${replace_user_args[@]}" "${user_args[@]}" "$@" } function compose_up() { default_compose_up "$@"; } function docker_up() { default_docker_up "$@"; } function auto_up() { local -a replace_env_args env_args local -a replace_run_args run_args local -a replace_user_args user_args if [ -f docker-compose.yml ]; then compose_set_env_args replace_run_args=(-d) compose_up "$@" else docker_set_env_args docker_check_name set_name replace_run_args=(-d --name "$name") docker_up "$@" fi } function default_compose_stop() { docker-compose \ "${replace_env_args[@]}" "${env_args[@]}" \ stop "${replace_stop_args[@]}" "${stop_args[@]}" \ "$@" } function default_docker_stop() { docker container stop \ "${replace_stop_args[@]}" "${stop_args[@]}" \ "$name" "$@" } function compose_stop() { default_compose_stop "$@"; } function docker_stop() { default_docker_stop "$@"; } function auto_stop() { local -a replace_env_args env_args local -a replace_stop_args stop_args if [ -f docker-compose.yml ]; then compose_set_env_args compose_stop "$@" else docker_set_env_args docker_check_name set_name docker_stop "$@" fi } function default_compose_logs() { docker-compose \ "${replace_env_args[@]}" "${env_args[@]}" \ logs "${replace_logs_args[@]}" "${logs_args[@]}" \ "$@" } function default_docker_logs() { docker logs \ "${replace_logs_args[@]}" "${logs_args[@]}" \ "$name" "$@" } function compose_logs() { default_compose_logs "$@"; } function docker_logs() { default_docker_logs "$@"; } function auto_logs() { local -a replace_env_args env_args local -a replace_logs_args logs_args if [ -f docker-compose.yml ]; then compose_set_env_args replace_logs_args=(-f) compose_logs "$@" else docker_set_env_args docker_check_name set_name replace_logs_args=(-f) docker_logs "$@" fi } function default_compose_down() { docker-compose \ "${replace_env_args[@]}" "${env_args[@]}" \ down "${replace_down_args[@]}" "${down_args[@]}" \ "$@" } function default_docker_down() { estep "stop" docker container stop \ "${replace_down_args[@]}" "${down_args[@]}" \ "$name" "$@" estep "rm" docker container rm \ "${replace_rm_args[@]}" "${rm_args[@]}" \ "$name" } function compose_down() { default_compose_down "$@"; } function docker_down() { default_docker_down "$@"; } function auto_down() { local -a replace_env_args env_args local -a replace_down_args down_args local -a replace_rm_args rm_args if [ -f docker-compose.yml ]; then compose_set_env_args compose_down "$@" else docker_set_env_args docker_check_name set_name docker_down "$@" fi } DEFAULT_PROFILE=devel set_defaults dk chdir= profile= args=(+ --help '$exit_with display_help' -d:,--chdir: chdir= -p:,--profile: profile= -P,--prod profile=prod -T,--test profile=test ) parse_args "$@"; set -- "${args[@]}" # construire par défaut [ $# -eq 0 ] && set -- build [ -n "$profile" ] || profile="$DEFAULT_PROFILE" [ -n "$chdir" ] && { cd "$chdir" || die; } while [ $# -gt 0 ]; do [ "$1" == -- ] && { shift; continue; } cmd="$1"; shift case "$cmd" in b|build) [ -f .build.scripts.sh ] && source ./.build.scripts.sh [ -f build.scripts.sh ] && source ./build.scripts.sh args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift done enote "Profil $profile" auto_build "${args[@]}" || die ;; s|run|start) args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift done enote "Profil $profile" auto_up "${args[@]}" || die ;; k|stop) enote "Profil $profile" auto_stop || die ;; 1|up) args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift done enote "Profil $profile" auto_up "${args[@]}" && auto_logs || die ;; l|logs) auto_logs || die;; 0|down) auto_down || die;; d|brd) do_auto_down=1 function auto_down_trap() { [ -n "$do_auto_down" ] && auto_down } trap auto_down_trap 1 3 15 EXIT args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift done enote "Profil $profile" if auto_build; then auto_up "${args[@]}" && auto_logs || die else do_auto_down= fi ;; ps) docker container ps -a || die;; ls) docker image ls || die;; rm) args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift done docker image rm "${args[@]}" || die ;; X|prune) docker container prune -f || die docker image prune -f || die ;; *) die "$cmd: commande inconnue";; esac done