12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/bin/sh
- #
- # Run docker-compose in a container
- #
- # This script will attempt to mirror the host paths by using volumes for the
- # following paths:
- # * $(pwd)
- # * $(dirname $COMPOSE_FILE) if it's set
- # * $HOME if it's set
- #
- # You can add additional volumes (or any docker run options) using
- # the $COMPOSE_OPTIONS environment variable.
- #
- set -e
- VERSION="1.26.1"
- IMAGE="docker/compose:$VERSION"
- # Setup options for connecting to docker host
- if [ -z "$DOCKER_HOST" ]; then
- DOCKER_HOST='unix:///var/run/docker.sock'
- fi
- if [ -S "${DOCKER_HOST#unix://}" ]; then
- DOCKER_ADDR="-v ${DOCKER_HOST#unix://}:${DOCKER_HOST#unix://} -e DOCKER_HOST"
- else
- DOCKER_ADDR="-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH"
- fi
- # Setup volume mounts for compose config and context
- if [ "$(pwd)" != '/' ]; then
- VOLUMES="-v $(pwd):$(pwd)"
- fi
- if [ -n "$COMPOSE_FILE" ]; then
- COMPOSE_OPTIONS="$COMPOSE_OPTIONS -e COMPOSE_FILE=$COMPOSE_FILE"
- compose_dir="$(dirname "$COMPOSE_FILE")"
- # canonicalize dir, do not use realpath or readlink -f
- # since they are not available in some systems (e.g. macOS).
- compose_dir="$(cd "$compose_dir" && pwd)"
- fi
- if [ -n "$COMPOSE_PROJECT_NAME" ]; then
- COMPOSE_OPTIONS="-e COMPOSE_PROJECT_NAME $COMPOSE_OPTIONS"
- fi
- if [ -n "$compose_dir" ]; then
- VOLUMES="$VOLUMES -v $compose_dir:$compose_dir"
- fi
- if [ -n "$HOME" ]; then
- VOLUMES="$VOLUMES -v $HOME:$HOME -e HOME" # Pass in HOME to share docker.config and allow ~/-relative paths to work.
- fi
- i=$#
- while [ $i -gt 0 ]; do
- arg=$1
- i=$((i - 1))
- shift
- case "$arg" in
- -f|--file)
- value=$1
- i=$((i - 1))
- shift
- set -- "$@" "$arg" "$value"
- file_dir=$(realpath "$(dirname "$value")")
- VOLUMES="$VOLUMES -v $file_dir:$file_dir"
- ;;
- *) set -- "$@" "$arg" ;;
- esac
- done
- # Setup environment variables for compose config and context
- ENV_OPTIONS=$(printenv | sed -E "/^PATH=.*/d; s/^/-e /g; s/=.*//g; s/\n/ /g")
- # Only allocate tty if we detect one
- if [ -t 0 ] && [ -t 1 ]; then
- DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
- fi
- # Always set -i to support piped and terminal input in run/exec
- DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -i"
- # Handle userns security
- if docker info --format '{{json .SecurityOptions}}' 2>/dev/null | grep -q 'name=userns'; then
- DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS --userns=host"
- fi
- # shellcheck disable=SC2086
- exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $ENV_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"
|