From 04c6042b3a5848fd3071aca2fe3b90a3aef50d01 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Sun, 20 Oct 2019 16:37:51 +0200 Subject: [PATCH] new: macosx compatibility --- bin/compose | 114 ++++++++++++++++++++++++++++++++++------------- bin/compose-core | 6 +-- 2 files changed, 86 insertions(+), 34 deletions(-) diff --git a/bin/compose b/bin/compose index 70796a0..94f7f66 100755 --- a/bin/compose +++ b/bin/compose @@ -7,8 +7,22 @@ ## Launcher ## - should need minimum requirement to run ## - no shell libs -## +## + +get_os() { + local uname_output machine + + uname_output="$(uname -s)" + case "${uname_output}" in + Linux*) machine=linux;; + Darwin*) machine=mac;; + CYGWIN*) machine=cygwin;; + MINGW*) machine=mingw;; + *) machine="UNKNOWN:${uname_output}" + esac + echo "${machine}" +} read-0() { @@ -49,7 +63,7 @@ is_volume_used() { clean_unused_sessions() { - for f in /var/lib/compose/sessions/*; do + for f in "$COMPOSE_VAR/sessions/"*; do [ -e "$f" ] || continue is_volume_used "$f" && continue rm -f "$f" @@ -75,10 +89,10 @@ mk_docker_run_options() { docker_run_opts=("-v" "/var/run/docker.sock:/var/run/docker.sock") ## CACHE/DATA DIRS - docker_run_opts+=("-v" "/var/lib/compose:/var/lib/compose") - docker_run_opts+=("-v" "/var/cache/compose:/var/cache/compose") + docker_run_opts+=("-v" "$COMPOSE_VAR:/var/lib/compose") + docker_run_opts+=("-v" "$COMPOSE_CACHE:/var/cache/compose") - docker_run_opts+=("-v" "/etc/timezone:/etc/timezone:ro") + docker_run_opts+=("-v" "$TZ_PATH:/etc/timezone:ro") ## current dir @@ -91,7 +105,7 @@ mk_docker_run_options() { cd .. done ); then - docker_path=/var/lib/compose/root/$(basename "$parent") + docker_path=$COMPOSE_VAR/root/$(basename "$parent") docker_run_opts+=("-v" "$parent:$docker_path:ro" \ "-w" "$docker_path") fi @@ -102,23 +116,13 @@ mk_docker_run_options() { ## if [ -z "$DISABLE_SYSTEM_CONFIG_FILE" ]; then - if [ -r /etc/default/charm ]; then - docker_run_opts+=("-v" "/etc/default/charm:/etc/default/charm:ro") - . /etc/default/charm - fi - ## XXXvlab: should provide YML config opportunities in possible parent dirs ? ## userdir ? and global /etc/compose.yml ? - for cfgfile in /etc/compose.conf /etc/compose.local.conf \ - /etc/default/compose /etc/compose/local.conf; do + for cfgfile in "${compose_config_files[@]}"; do [ -e "$cfgfile" ] || continue docker_run_opts+=("-v" "$cfgfile:$cfgfile:ro") . "$cfgfile" done - for cfgfile in /etc/default/datastore; do - [ -e "$cfgfile" ] || continue - docker_run_opts+=("-v" "$cfgfile:$cfgfile:ro") - done else docker_run_opts+=("-e" "DISABLE_SYSTEM_CONFIG_FILE=$DISABLE_SYSTEM_CONFIG_FILE") fi @@ -131,9 +135,13 @@ mk_docker_run_options() { ## CHARM_STORE CHARM_STORE=${CHARM_STORE:-/srv/charm-store} [ -L "$CHARM_STORE" ] && { - CHARM_STORE=$(readlink "$CHARM_STORE") || exit 1 + CHARM_STORE=$(readlink -f "$CHARM_STORE") || exit 1 } - docker_run_opts+=("-v" "$CHARM_STORE:/srv/charm-store:ro") + docker_run_opts+=( + "-v" "$CHARM_STORE:/srv/charm-store:ro" + "-e" "CHARM_STORE=/srv/charm-store" + "-e" "HOST_CHARM_STORE=$CHARM_STORE" + ) relink_subdirs /srv/charm-store/* ## DEFAULT_COMPOSE_FILE @@ -148,22 +156,29 @@ mk_docker_run_options() { ## COMPOSE_YML_FILE if [ "${COMPOSE_YML_FILE+x}" ]; then if [ -e "${COMPOSE_YML_FILE}" ]; then - docker_run_opts+=("-v" "$COMPOSE_YML_FILE:/tmp/compose.yml:ro") - docker_run_opts+=("-e" "COMPOSE_YML_FILE=/tmp/compose.yml") + docker_run_opts+=( + "-v" "$COMPOSE_YML_FILE:/tmp/compose.yml:ro" + "-e" "COMPOSE_YML_FILE=/tmp/compose.yml" + "-e" "HOST_COMPOSE_YML_FILE=/tmp/compose.yml" + ) fi fi ## DATASTORE - if [ "${DATASTORE+x}" ]; then - docker_run_opts+=("-v" "$DATASTORE:/srv/datastore/data:rw") - docker_run_opts+=("-e" "DATASTORE=/srv/datastore/data") - fi + DATASTORE=${DATASTORE:-/srv/datastore/data} + docker_run_opts+=( + "-v" "$DATASTORE:/srv/datastore/data:rw" + "-e" "DATASTORE=/srv/datastore/data" + "-e" "HOST_DATASTORE=$DATASTORE" + ) ## CONFIGSTORE - if [ "${CONFIGSTORE+x}" ]; then - docker_run_opts+=("-v" "$CONFIGSTORE:/srv/datastore/config:rw") - docker_run_opts+=("-e" "CONFIGSTORE=/srv/datastore/config") - fi + CONFIGSTORE=${CONFIGSTORE:-/srv/datastore/config} + docker_run_opts+=( + "-v" "$CONFIGSTORE:/srv/datastore/config:rw" + "-e" "CONFIGSTORE=/srv/datastore/config" + "-e" "HOST_CONFIGSTORE=$CONFIGSTORE" + ) docker_run_opts+=("-v" "$HOME/.docker:/root/.docker") @@ -171,6 +186,7 @@ mk_docker_run_options() { docker_run_opts+=("-e" "COMPOSE_DOCKER_IMAGE=$COMPOSE_DOCKER_IMAGE") COMPOSE_LAUNCHER_BIN=$(readlink -f "${BASH_SOURCE[0]}") + docker_run_opts+=("-v" "$COMPOSE_LAUNCHER_BIN:/usr/local/bin/compose") filename=$(mktemp -p /tmp/ -t launch_opts-XXXXXXXXXXXXXXXX) { @@ -178,19 +194,55 @@ mk_docker_run_options() { } > "$filename" sha=$(sha256sum "$filename") sha=${sha:0:64} - dest="/var/lib/compose/sessions/$sha" + dest="$COMPOSE_VAR/sessions/$sha" { printf "%s\0" "-v" "$dest:$dest" printf "%s\0" "-e" "COMPOSE_LAUNCHER_OPTS=$dest" printf "%s\0" "-e" "COMPOSE_LAUNCHER_BIN=$COMPOSE_LAUNCHER_BIN" } >> "$filename" - mkdir -p /var/lib/compose/sessions + mkdir -p "$COMPOSE_VAR"/sessions mv "$filename" "$dest" echo "$dest" } run() { + local os docker_run_opts + + ## Order matters, files get to override vars + compose_config_files=( + /etc/default/charm + /etc/default/datastore + /etc/compose.conf + /etc/compose.local.conf + /etc/default/compose + ~/.compose/etc/local.conf + /etc/compose/local.conf + ) + + os=$(get_os) + case "$os" in + linux) + COMPOSE_VAR=/var/lib/compose + COMPOSE_CACHE=/var/cache/compose + TZ_PATH=/etc/timezone + ;; + mac) + if ! [ -e "$HOME/.compose/etc/timezone" ]; then + TZ=${TZ:-"Europe/Paris"} + echo "$TZ" > "$HOME"/.compose/etc/timezone + fi + TZ_PATH="$HOME"/.compose/etc/timezone + COMPOSE_VAR="$HOME"/.compose/lib + COMPOSE_CACHE="$HOME"/.compose/cache + ;; + *) + echo "System '$os' not supported yet." >&2 + exit 1 + ;; + esac + + docker_run_opts=() if [ -z "$COMPOSE_LAUNCHER_OPTS" ]; then clean_unused_sessions diff --git a/bin/compose-core b/bin/compose-core index 34b2a61..dfffda5 100755 --- a/bin/compose-core +++ b/bin/compose-core @@ -731,7 +731,7 @@ ensure_db_docker_running () { docker rm "$_DB_NAME" 2>/dev/null || true - host_db_working_dir="$DATASTORE/${SERVICE_NAME}$DB_DATADIR" + host_db_working_dir="$HOST_DATASTORE/${SERVICE_NAME}$DB_DATADIR" if is_db_locked; then info "Some process is using '$host_db_working_dir'. Trying to find a docker that would do this..." @@ -814,7 +814,7 @@ _dcmd() { debug "Db> $command $@" - if [ -f "$HOST_DB_PASSFILE" -a "$CLIENT_DB_PASSFILE" ]; then + if [ "$HOST_DB_PASSFILE" -a -f "$LOCAL_DB_PASSFILE" -a "$CLIENT_DB_PASSFILE" ]; then verb "Found and using '$HOST_DB_PASSFILE' as '$CLIENT_DB_PASSFILE'." docker_opts=("${db_docker_opts[@]}" "-v" "$HOST_DB_PASSFILE:$CLIENT_DB_PASSFILE") else @@ -2953,7 +2953,7 @@ _get_docker_compose_mixin_from_metadata_cached() { volumes=$( for resource_type in data config; do while read-0 resource; do - eval "echo \" - \$${resource_type^^}STORE/\$service\$resource:\$resource:rw\"" + eval "echo \" - \$HOST_${resource_type^^}STORE/\$service\$resource:\$resource:rw\"" done < <(echo "$metadata" | shyaml get-values-0 "${resource_type}-resources" 2>/dev/null) done while read-0 resource; do