mirror of https://github.com/docker/compose.git
92 lines
2.5 KiB
Bash
Executable File
92 lines
2.5 KiB
Bash
Executable File
#!/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 "$@"
|