@@ -53,7 +53,7 @@ readonly LOCAL_OUTPUT_BUILD="${LOCAL_OUTPUT_ROOT}/build"
53
53
readonly REMOTE_OUTPUT_ROOT=" /go/src/${KUBE_GO_PACKAGE} /_output"
54
54
readonly REMOTE_OUTPUT_DIR=" ${REMOTE_OUTPUT_ROOT} /build"
55
55
readonly DOCKER_CONTAINER_NAME=kube-build
56
- readonly DOCKER_MOUNT= " -v ${LOCAL_OUTPUT_BUILD} :${REMOTE_OUTPUT_DIR} "
56
+ readonly DOCKER_MOUNT_ARGS=(--volume " ${LOCAL_OUTPUT_BUILD} :${REMOTE_OUTPUT_DIR} " )
57
57
58
58
readonly KUBE_CLIENT_BINARIES=(
59
59
kubecfg
@@ -114,6 +114,7 @@ function kube::build::verify_prereqs() {
114
114
echo " - On Mac OS X, boot2docker VM isn't started" >&2
115
115
echo " - On Mac OS X, DOCKER_HOST env variable isn't set approriately" >&2
116
116
echo " - On Linux, user isn't in 'docker' group. Add and relogin." >&2
117
+ echo " Something like 'sudo usermod -a -G docker ${USER-user} '" >&2
117
118
echo " - On Linux, Docker daemon hasn't been started or has crashed" >&2
118
119
return 1
119
120
fi
@@ -207,25 +208,23 @@ function kube::build::run_image() {
207
208
function kube::build::docker_build() {
208
209
local -r image=$1
209
210
local -r context_dir=$2
210
- local -r build_cmd=" docker build -t ${image} ${context_dir} "
211
+ local -ra build_cmd=( docker build -t " ${image} " " ${context_dir} " )
211
212
212
213
echo " +++ Building Docker image ${image} . This can take a while."
213
- set +e # We are handling the error here manually
214
214
local docker_output
215
- docker_output=$( ${build_cmd} 2>&1 )
216
- if [[ $? -ne 0 ]] ; then
217
- set -e
218
- echo " +++ Docker build command failed for ${image} " >&2
219
- echo >&2
220
- echo " ${docker_output} " >&2
221
- echo >&2
222
- echo " To retry manually, run: " >&2
223
- echo >&2
224
- echo " ${build_cmd} " >&2
225
- echo >&2
215
+ docker_output=$( " ${build_cmd[@]} " 2>&1 ) || {
216
+ cat << EOF >&2
217
+ +++ Docker build command failed for ${image}
218
+
219
+ ${docker_output}
220
+
221
+ To retry manually, run:
222
+
223
+ ${build_cmd[*]}
224
+
225
+ EOF
226
226
return 1
227
- fi
228
- set -e
227
+ }
229
228
}
230
229
231
230
function kube::build::clean_image() {
@@ -252,18 +251,21 @@ function kube::build::clean_images() {
252
251
# Run a command in the kube-build image. This assumes that the image has
253
252
# already been built. This will sync out all output data from the build.
254
253
function kube::build::run_build_command() {
255
- [[ -n " $@ " ]] || { echo " Invalid input." >&2 ; return 4; }
254
+ [[ $# != 0 ]] || { echo " Invalid input." >&2 ; return 4; }
256
255
257
- local -r docker=" docker run --name=${DOCKER_CONTAINER_NAME} --attach=stdout --attach=stderr --attach=stdin --tty ${DOCKER_MOUNT} ${KUBE_BUILD_IMAGE} "
256
+ local -ra docker_cmd=(
257
+ docker run " --name=${DOCKER_CONTAINER_NAME} "
258
+ --interactive --tty
259
+ " ${DOCKER_MOUNT_ARGS[@]} " " ${KUBE_BUILD_IMAGE} " )
258
260
259
261
# Remove the container if it is left over from some previous aborted run
260
- docker rm ${DOCKER_CONTAINER_NAME} > /dev/null 2>&1 || true
261
- ${docker} " $@ "
262
+ docker rm " ${DOCKER_CONTAINER_NAME} " > /dev/null 2>&1 || true
263
+ " ${docker_cmd[@]} " " $@ "
262
264
263
265
# Remove the container after we run. '--rm' might be appropriate but it
264
266
# appears that sometimes it fails. See
265
267
# https://github.com/docker/docker/issues/3968
266
- docker rm ${DOCKER_CONTAINER_NAME} > /dev/null 2>&1 || true
268
+ docker rm " ${DOCKER_CONTAINER_NAME} " > /dev/null 2>&1 || true
267
269
}
268
270
269
271
# If the Docker server is remote, copy the results back out.
@@ -278,21 +280,23 @@ function kube::build::copy_output() {
278
280
# The easiest thing I (jbeda) could figure out was to launch another
279
281
# container pointed at the same volume, tar the output directory and ship
280
282
# that tar over stdou.
281
- local -r docker=" docker run -a stdout --name=${DOCKER_CONTAINER_NAME} ${DOCKER_MOUNT} ${KUBE_BUILD_IMAGE} "
283
+ local -ra docker_cmd=(
284
+ docker run -a stdout " --name=${DOCKER_CONTAINER_NAME} "
285
+ " ${DOCKER_MOUNT_ARGS[@]} " " ${KUBE_BUILD_IMAGE} " )
282
286
283
287
# Kill any leftover container
284
- docker rm ${DOCKER_CONTAINER_NAME} > /dev/null 2>&1 || true
288
+ docker rm " ${DOCKER_CONTAINER_NAME} " > /dev/null 2>&1 || true
285
289
286
290
echo " +++ Syncing back _output directory from boot2docker VM"
287
291
rm -rf " ${LOCAL_OUTPUT_BUILD} "
288
292
mkdir -p " ${LOCAL_OUTPUT_BUILD} "
289
- ${docker} sh -c " tar c -C ${REMOTE_OUTPUT_DIR} . ; sleep 1" \
293
+ " ${docker_cmd[@]} " sh -c " tar c -C ${REMOTE_OUTPUT_DIR} . ; sleep 1" \
290
294
| tar xv -C " ${LOCAL_OUTPUT_BUILD} "
291
295
292
296
# Remove the container after we run. '--rm' might be appropriate but it
293
297
# appears that sometimes it fails. See
294
298
# https://github.com/docker/docker/issues/3968
295
- docker rm ${DOCKER_CONTAINER_NAME} > /dev/null 2>&1 || true
299
+ docker rm " ${DOCKER_CONTAINER_NAME} " > /dev/null 2>&1 || true
296
300
297
301
# I (jbeda) also tried getting rsync working using 'docker run' as the
298
302
# 'remote shell'. This mostly worked but there was a hang when
@@ -440,7 +444,7 @@ function kube::release::gcs::verify_prereqs() {
440
444
if [[ -z " ${GCLOUD_ACCOUNT-} " ]]; then
441
445
GCLOUD_ACCOUNT=$( gcloud auth list 2> /dev/null | awk ' /(active)/ { print $2 }' )
442
446
fi
443
- if [[ -z " ${GCLOUD_ACCOUNT} " ]]; then
447
+ if [[ -z " ${GCLOUD_ACCOUNT- } " ]]; then
444
448
echo " No account authorized through gcloud. Please fix with:"
445
449
echo
446
450
echo " gcloud auth login"
@@ -450,7 +454,7 @@ function kube::release::gcs::verify_prereqs() {
450
454
if [[ -z " ${GCLOUD_PROJECT-} " ]]; then
451
455
GCLOUD_PROJECT=$( gcloud config list project | awk ' {project = $3} END {print project}' )
452
456
fi
453
- if [[ -z " ${GCLOUD_PROJECT} " ]]; then
457
+ if [[ -z " ${GCLOUD_PROJECT- } " ]]; then
454
458
echo " No account authorized through gcloud. Please fix with:"
455
459
echo
456
460
echo " gcloud config set project <project id>"
@@ -471,9 +475,9 @@ function kube::release::gcs::ensure_release_bucket() {
471
475
KUBE_GCS_RELEASE_PREFIX=${KUBE_GCS_RELEASE_PREFIX-devel/ }
472
476
KUBE_GCS_DOCKER_REG_PREFIX=${KUBE_GCS_DOCKER_REG_PREFIX-docker-reg/ }
473
477
474
- if ! gsutil ls gs://${KUBE_GCS_RELEASE_BUCKET} > /dev/null 2>&1 ; then
478
+ if ! gsutil ls " gs://${KUBE_GCS_RELEASE_BUCKET} " > /dev/null 2>&1 ; then
475
479
echo " Creating Google Cloud Storage bucket: $RELEASE_BUCKET "
476
- gsutil mb gs://${KUBE_GCS_RELEASE_BUCKET}
480
+ gsutil mb " gs://${KUBE_GCS_RELEASE_BUCKET} "
477
481
fi
478
482
}
479
483
@@ -487,7 +491,8 @@ function kube::release::gcs::ensure_docker_registry() {
487
491
488
492
# Grovel around and find the OAuth token in the gcloud config
489
493
local -r boto=~ /.config/gcloud/legacy_credentials/${GCLOUD_ACCOUNT} /.boto
490
- local -r refresh_token=$( grep ' gs_oauth2_refresh_token =' $boto | awk ' { print $3 }' )
494
+ local refresh_token
495
+ refresh_token=$( grep ' gs_oauth2_refresh_token =' " $boto " | awk ' { print $3 }' )
491
496
492
497
if [[ -z " $refresh_token " ]]; then
493
498
echo " Couldn't find OAuth 2 refresh token in ${boto} " >&2
@@ -498,14 +503,16 @@ function kube::release::gcs::ensure_docker_registry() {
498
503
docker rm ${reg_container_name} > /dev/null 2>&1 || true
499
504
500
505
echo " +++ Starting GCS backed Docker registry"
501
- local docker=" docker run -d --name=${reg_container_name} "
502
- docker+=" -e GCS_BUCKET=${KUBE_GCS_RELEASE_BUCKET} "
503
- docker+=" -e STORAGE_PATH=${KUBE_GCS_DOCKER_REG_PREFIX} "
504
- docker+=" -e GCP_OAUTH2_REFRESH_TOKEN=${refresh_token} "
505
- docker+=" -p 127.0.0.1:5000:5000 "
506
- docker+=" google/docker-registry"
507
-
508
- ${docker}
506
+ local -ra docker_cmd=(
507
+ docker run -d " --name=${reg_container_name} "
508
+ -e " GCS_BUCKET=${KUBE_GCS_RELEASE_BUCKET} "
509
+ -e " STORAGE_PATH=${KUBE_GCS_DOCKER_REG_PREFIX} "
510
+ -e " GCP_OAUTH2_REFRESH_TOKEN=${refresh_token} "
511
+ -p 127.0.0.1:5000:5000
512
+ google/docker-registry
513
+ )
514
+
515
+ " ${docker[@]} "
509
516
510
517
# Give it time to spin up before we start throwing stuff at it
511
518
sleep 5
0 commit comments