You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by fr...@apache.org on 2017/05/31 14:09:54 UTC
[16/24] incubator-trafficcontrol git commit: Update pkg script to
pull docker-compose into a local container if it is unavailable in the path.
Update pkg script to pull docker-compose into a local container if it is unavailable in the path.
(cherry picked from commit 4b4be596d0bbaae7f67622062d32a9097dd64438)
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/e94ac08b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/e94ac08b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/e94ac08b
Branch: refs/heads/2.0.x
Commit: e94ac08bedee0357a3562d70516eb467d1d32a8c
Parents: 7685142
Author: Chris Lemmons <al...@gmail.com>
Authored: Wed Mar 15 13:33:08 2017 -0600
Committer: Eric Friedrich <fr...@apache.org>
Committed: Wed May 31 10:08:57 2017 -0400
----------------------------------------------------------------------
BUILD.md | 5 +++-
pkg | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 71 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/e94ac08b/BUILD.md
----------------------------------------------------------------------
diff --git a/BUILD.md b/BUILD.md
index eb6c8f1..000d25a 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -7,7 +7,10 @@ are automatically loaded into the image used to build each component.
### Requirements
- `docker` (https://docs.docker.com/engine/installation/)
-- `docker-compose` (https://docs.docker.com/compose/install/)
+- `docker-compose` (https://docs.docker.com/compose/install/) (optional, but recommended)
+
+If `docker-compose` is not available, the `pkg` script will automatically download
+and run it in a container. This is noticeably slower than running it natively.
### Steps
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/e94ac08b/pkg
----------------------------------------------------------------------
diff --git a/pkg b/pkg
index fe195b4..2912bcb 100755
--- a/pkg
+++ b/pkg
@@ -18,16 +18,76 @@ cd "$( dirname "${BASH_SOURCE[0]}" )"
COMPOSE_FILE=./infrastructure/docker/build/docker-compose.yml
# Check for dependencies
-if ! which docker-compose >/dev/null 2>&1; then
- echo "Error: docker-compose is required for a docker build." >&2
+if ! which docker >/dev/null 2>&1; then
+ echo "Error: docker is required for a docker build." >&2
exit 1
fi
+# If the user defined COMPOSE, use that as the path for docker-compose.
+if [ ! -z "$COMPOSE" ]; then
+ COMPOSECMD=( "$COMPOSE" )
+else
+ COMPOSECMD=()
+fi
+
+# Check to see if docker-compose is already installed and use it directly, if possible.
+if [ ${#COMPOSECMD[@]} -eq 0 ]; then
+ if which docker-compose >/dev/null 2>&1; then
+ COMPOSECMD=( docker-compose )
+ fi
+fi
+
+# If it's unavailable, go get the image and run docker-compose inside a container.
+# This is considerably slower, but allows for building on hosts without docker-compose.
+if [ ${#COMPOSECMD[@]} -eq 0 ]; then
+ # Pin the version of docker-compose.
+ IMAGE="docker/compose:1.11.2"
+
+ # We need to either mount the docker socket or export the docker host into the container.
+ # This allows the container to manage "sibling" containers via docker.
+ if [ -z "$DOCKER_HOST" ]; then
+ DOCKER_HOST="/var/run/docker.sock"
+ fi
+
+ if [ -S "$DOCKER_HOST" ]; then
+ DOCKER_ADDR=(-v "$DOCKER_HOST:$DOCKER_HOST" -e DOCKER_HOST)
+ else
+ DOCKER_ADDR=(-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH)
+ fi
+
+ # We mount the current directory (the base of the repository) into the same location
+ # inside the container. There are many places for which this won't work, but "/" is
+ # a major one.
+ #
+ # You're going to want to avoid keeping your repository in a folder named "/usr/bin",
+ # "/home", "/var" or any other standard paths that will be needed by the docker container.
+ #
+ # This is very unlikely to cause trouble for anyone in practice.
+ if [ "$(pwd)" == "/" ]; then
+ echo "Error: Cannot compile directly at filesystem root." >&2
+ exit 1
+ fi
+
+ # Mount the working directory, and the home directory. Mounting $HOME provides container
+ # access to config files that are kept there.
+ VOLUMES=(-v "$(pwd):$(pwd)" -v "$HOME:$HOME" -v "$HOME:/root")
+
+ # Prepull the image, to avoid spitting out pull progress during other commands.
+ if ! docker inspect $IMAGE >/dev/null 2>&1; then
+ docker pull $IMAGE >/dev/null 2>&1
+ fi
+
+ # COMPOSECMD is kept as an array to significantly simplify handling paths that contain
+ # spaces and other special characters.
+ COMPOSECMD=(docker run --rm "${DOCKER_ADDR[@]}" $COMPOSE_OPTIONS "${VOLUMES[@]}" -w "$(pwd)" $IMAGE)
+fi
+
# Parse command line arguments
verbose=0
-while getopts lvq? opt; do
+while getopts :lvq? opt; do
case $opt in
\?)
+ PROJECTS=`$SELF -l | sed "s/^/ - /"`
echo "Usage: $SELF [options] [projects]"
echo " -q Quiet mode. Supresses output."
echo " -v Verbose mode. Lists all build output."
@@ -35,7 +95,7 @@ while getopts lvq? opt; do
echo
echo " If no projects are listed, all projects will be packaged."
echo " Valid projects:"
- $SELF -l | sed "s/^/ - /"
+ cat <<< "$PROJECTS"
exit 0
;;
q)
@@ -45,7 +105,7 @@ while getopts lvq? opt; do
verbose=1
;;
l)
- docker-compose -f $COMPOSE_FILE config --services
+ "${COMPOSECMD[@]}" -f $COMPOSE_FILE config --services
exit $?
;;
esac
@@ -67,8 +127,8 @@ while (( "$#" )); do
if (( "$verbose" == 0 )); then
exec >/dev/null 2>&1
fi
- docker-compose -f $COMPOSE_FILE build $1 || exit 1
- docker-compose -f $COMPOSE_FILE run --rm $1 || exit 1
+ "${COMPOSECMD[@]}" -f $COMPOSE_FILE build $1 || exit 1
+ "${COMPOSECMD[@]}" -f $COMPOSE_FILE run --rm $1 || exit 1
) || {
# Don't totally bail out, but make note of the failures.
failure=1