diff --git a/dockerfiles/base/scripts/base/cli/cli-functions.sh b/dockerfiles/base/scripts/base/cli/cli-functions.sh index 4278c337833..5d4522bdbb8 100644 --- a/dockerfiles/base/scripts/base/cli/cli-functions.sh +++ b/dockerfiles/base/scripts/base/cli/cli-functions.sh @@ -118,24 +118,24 @@ initiate_offline_or_network_mode(){ grab_initial_images() { # Prep script by getting default image - if [ "$(docker images -q alpine:3.4 2> /dev/null)" = "" ]; then - info "cli" "Pulling image alpine:3.4" - log "docker pull alpine:3.4 >> \"${LOGS}\" 2>&1" + if [ "$(docker images -q ${UTILITY_IMAGE_ALPINE} 2> /dev/null)" = "" ]; then + info "cli" "Pulling image ${UTILITY_IMAGE_ALPINE}" + log "docker pull ${UTILITY_IMAGE_ALPINE} >> \"${LOGS}\" 2>&1" TEST="" - docker pull alpine:3.4 >> "${LOGS}" > /dev/null 2>&1 || TEST=$? + docker pull ${UTILITY_IMAGE_ALPINE} >> "${LOGS}" > /dev/null 2>&1 || TEST=$? if [ "$TEST" = "1" ]; then - error "Image alpine:3.4 unavailable. Not on dockerhub or built locally." + error "Image ${UTILITY_IMAGE_ALPINE} unavailable. Not on dockerhub or built locally." return 2; fi fi - if [ "$(docker images -q eclipse/che-ip:nightly 2> /dev/null)" = "" ]; then - info "cli" "Pulling image eclipse/che-ip:nightly" - log "docker pull eclipse/che-ip:nightly >> \"${LOGS}\" 2>&1" + if [ "$(docker images -q ${UTILITY_IMAGE_CHEIP} 2> /dev/null)" = "" ]; then + info "cli" "Pulling image ${UTILITY_IMAGE_CHEIP}" + log "docker pull ${UTILITY_IMAGE_CHEIP} >> \"${LOGS}\" 2>&1" TEST="" - docker pull eclipse/che-ip:nightly >> "${LOGS}" > /dev/null 2>&1 || TEST=$? + docker pull ${UTILITY_IMAGE_CHEIP} >> "${LOGS}" > /dev/null 2>&1 || TEST=$? if [ "$TEST" = "1" ]; then - error "Image eclipse/che-ip:nightly unavailable. Not on dockerhub or built locally." + error "Image ${UTILITY_IMAGE_CHEIP} unavailable. Not on dockerhub or built locally." return 2; fi fi @@ -460,7 +460,7 @@ confirm_operation() { port_open() { debug $FUNCNAME - docker run -d -p $1:$1 --name fake alpine:3.4 httpd -f -p $1 -h /etc/ > /dev/null 2>&1 + docker run -d -p $1:$1 --name fake ${UTILITY_IMAGE_ALPINE} httpd -f -p $1 -h /etc/ > /dev/null 2>&1 NETSTAT_EXIT=$? docker rm -f fake > /dev/null 2>&1 diff --git a/dockerfiles/base/scripts/base/commands/cmd_action.sh b/dockerfiles/base/scripts/base/commands/cmd_action.sh index aba321c9dde..9516dc0f87b 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_action.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_action.sh @@ -18,8 +18,8 @@ cmd_action() { server_is_booted ${CURRENT_CHE_SERVER_CONTAINER_ID}; then # Not loaded as part of the init process to save on download time - update_image_if_not_found eclipse/che-action:nightly - docker_run -it eclipse/che-action:nightly "$@" + update_image_if_not_found ${UTILITY_IMAGE_CHEACTION} + docker_run -it ${UTILITY_IMAGE_CHEACTION} "$@" return fi diff --git a/dockerfiles/base/scripts/base/commands/cmd_backup.sh b/dockerfiles/base/scripts/base/commands/cmd_backup.sh index a5a6f020c7a..cb56ab5bc0f 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_backup.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_backup.sh @@ -44,7 +44,7 @@ cmd_backup() { docker_run -v "${CHE_HOST_CONFIG}":/root${CHE_CONTAINER_ROOT} \ -v "${CHE_HOST_BACKUP}":/root/backup \ $(cmd_backup_extra_args) \ - alpine:3.4 sh -c "tar czf /root/backup/${CHE_BACKUP_FILE_NAME} -C /root${CHE_CONTAINER_ROOT} . --exclude='backup' --exclude='instance/dev' --exclude='instance/logs' ${TAR_EXTRA_EXCLUDE}" + ${UTILITY_IMAGE_ALPINE} sh -c "tar czf /root/backup/${CHE_BACKUP_FILE_NAME} -C /root${CHE_CONTAINER_ROOT} . --exclude='backup' --exclude='instance/dev' --exclude='instance/logs' ${TAR_EXTRA_EXCLUDE}" info "" info "backup" "Codenvy data saved in ${CHE_HOST_BACKUP}/${CHE_BACKUP_FILE_NAME}" } diff --git a/dockerfiles/base/scripts/base/commands/cmd_config.sh b/dockerfiles/base/scripts/base/commands/cmd_config.sh index 193abf4ddb5..b69f918c5de 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_config.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_config.sh @@ -52,11 +52,11 @@ cmd_config() { # in development mode to avoid permissions issues we copy tomcat assembly to ${CHE_INSTANCE} # if ${CHE_FORMAL_PRODUCT_NAME} development tomcat exist we remove it if [[ -d "${CHE_CONTAINER_INSTANCE}/dev" ]]; then - log "docker_run -v \"${CHE_HOST_INSTANCE}/dev\":/root/dev alpine:3.4 sh -c \"rm -rf /root/dev/*\"" + log "docker_run -v \"${CHE_HOST_INSTANCE}/dev\":/root/dev ${UTILITY_IMAGE_ALPINE} sh -c \"rm -rf /root/dev/*\"" # Super weird bug - sometimes, the RM command doesn't wipe everything, so we have to repeat it a couple times until config_directory_is_empty; do - docker_run -v "${CHE_HOST_INSTANCE}/dev":/root/dev alpine:3.4 sh -c "rm -rf /root/dev/${CHE_MINI_PRODUCT_NAME}-tomcat" > /dev/null 2>&1 || true + docker_run -v "${CHE_HOST_INSTANCE}/dev":/root/dev ${UTILITY_IMAGE_ALPINE} sh -c "rm -rf /root/dev/${CHE_MINI_PRODUCT_NAME}-tomcat" > /dev/null 2>&1 || true done log "rm -rf \"${CHE_HOST_INSTANCE}/dev\" >> \"${LOGS}\"" diff --git a/dockerfiles/base/scripts/base/commands/cmd_destroy.sh b/dockerfiles/base/scripts/base/commands/cmd_destroy.sh index 3b066c3624f..00d759758ed 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_destroy.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_destroy.sh @@ -28,7 +28,7 @@ cmd_destroy() { --cli) DESTROY_CLI="true" shift ;; - *) error "Unknown parameter: $1" ; return 2 ;; + *) error "Unknown parameter: $1; did you mean --quiet or --cli?" ; return 2 ;; esac done @@ -42,14 +42,14 @@ cmd_destroy() { info "destroy" "Deleting instance and config..." log "docker_run -v \"${CHE_HOST_CONFIG}\":${CHE_CONTAINER_ROOT} \ - alpine:3.4 sh -c \"rm -rf /root${CHE_CONTAINER_ROOT}/docs \ + ${UTILITY_IMAGE_ALPINE} sh -c \"rm -rf /root${CHE_CONTAINER_ROOT}/docs \ && rm -rf /root${CHE_CONTAINER_ROOT}/instance \ && rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env\"" # Super weird bug. For some reason on windows, this command has to be run 3x for everything # to be destroyed properly if you are in dev mode. until directory_is_empty; do docker_run -v "${CHE_HOST_CONFIG}":/root${CHE_CONTAINER_ROOT} \ - alpine:3.4 sh -c "rm -rf /root${CHE_CONTAINER_ROOT}/docs \ + ${UTILITY_IMAGE_ALPINE} sh -c "rm -rf /root${CHE_CONTAINER_ROOT}/docs \ ; rm -rf /root${CHE_CONTAINER_ROOT}/instance \ ; rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env" > /dev/null 2>&1 || true done @@ -61,7 +61,7 @@ cmd_destroy() { # If they pass destroy --cli then we will also destroy the CLI if [[ "${DESTROY_CLI}" = "true" ]]; then info "destroy" "Deleting cli.log..." - docker_run -v "${CLI_DIR}":/root/cli alpine:3.4 sh -c "rm -rf /root/cli/cli.log" + docker_run -v "${CLI_DIR}":/root/cli ${UTILITY_IMAGE_ALPINE} sh -c "rm -rf /root/cli/cli.log" fi } diff --git a/dockerfiles/base/scripts/base/commands/cmd_dir.sh b/dockerfiles/base/scripts/base/commands/cmd_dir.sh index f91438a22da..9bdb1316b9a 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_dir.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_dir.sh @@ -7,15 +7,18 @@ # cmd_dir() { + debug $FUNCNAME - if [[ $# -eq 0 ]] ; then - error "dir command is requiring a local folder to be given as argument" - return 2; - fi - - local HOST_FOLDER_TO_USE=${1} + CHE_LOCAL_REPO=false + if [[ "${CHEDIR_MOUNT}" != "not set" ]]; then + local HOST_FOLDER_TO_USE="${CHEDIR_MOUNT}" + else + local HOST_FOLDER_TO_USE="${DATA_MOUNT}" + warning "':/chedir' not mounted - using ${DATA_MOUNT} as source location" + fi + # Not loaded as part of the init process to save on download time - update_image_if_not_found eclipse/che-dir:nightly - docker_run -it -v ${HOST_FOLDER_TO_USE}:${HOST_FOLDER_TO_USE} eclipse/che-dir:nightly "$@" + update_image_if_not_found ${UTILITY_IMAGE_CHEDIR} + docker_run -it -v ${HOST_FOLDER_TO_USE}:${HOST_FOLDER_TO_USE} ${UTILITY_IMAGE_CHEDIR} ${HOST_FOLDER_TO_USE} "$@" } diff --git a/dockerfiles/base/scripts/base/commands/cmd_network.sh b/dockerfiles/base/scripts/base/commands/cmd_network.sh index 505be410fe8..27d27ba08cd 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_network.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_network.sh @@ -21,8 +21,8 @@ cmd_network() { info "-------- CONNECTIVITY TEST --------" info "---------------------------------------" # Start a fake workspace agent - log "docker run -d -p 12345:80 --name fakeagent alpine:3.4 httpd -f -p 80 -h /etc/ >> \"${LOGS}\"" - docker run -d -p 12345:80 --name fakeagent alpine:3.4 httpd -f -p 80 -h /etc/ >> "${LOGS}" + log "docker run -d -p 12345:80 --name fakeagent ${UTILITY_IMAGE_ALPINE} httpd -f -p 80 -h /etc/ >> \"${LOGS}\"" + docker run -d -p 12345:80 --name fakeagent ${UTILITY_IMAGE_ALPINE} httpd -f -p 80 -h /etc/ >> "${LOGS}" AGENT_INTERNAL_IP=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' fakeagent) AGENT_INTERNAL_PORT=80 diff --git a/dockerfiles/base/scripts/base/commands/cmd_offline.sh b/dockerfiles/base/scripts/base/commands/cmd_offline.sh index a7dcd64c625..1fadab766e8 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_offline.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_offline.sh @@ -23,7 +23,7 @@ cmd_offline() { readarray -t STACK_IMAGE_LIST < /version/$CHE_VERSION/images-stacks # List all images to be saved - if [ $1 = "--list" ]; then + if [[ $# -gt 0 ]] && [[ $1 = "--list" ]]; then # First display mandatory info "offline" "Listing images to save for offline usage" info "" @@ -54,6 +54,14 @@ cmd_offline() { info "offline" "Saving ${CHE_MINI_PRODUCT_NAME} cli image..." save_image ${CHE_IMAGE_FULLNAME} + info "offline" "Saving utility images..." + download_and_save_image "${UTILITY_IMAGE_CHEIP}" + download_and_save_image "${UTILITY_IMAGE_ALPINE}" + download_and_save_image "${UTILITY_IMAGE_CHEACTION}" + download_and_save_image "${UTILITY_IMAGE_CHEDIR}" + download_and_save_image "${UTILITY_IMAGE_CHETEST}" + download_and_save_image "${UTILITY_IMAGE_CHEMOUNT}" + info "offline" "Saving ${CHE_MINI_PRODUCT_NAME} system images..." IFS=$'\n' for SINGLE_IMAGE in $IMAGE_LIST; do diff --git a/dockerfiles/base/scripts/base/commands/cmd_restore.sh b/dockerfiles/base/scripts/base/commands/cmd_restore.sh index bcfa067d5ec..5579e69cb1c 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_restore.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_restore.sh @@ -39,13 +39,13 @@ cmd_restore() { # remove config and instance folders log "docker_run -v \"${CHE_HOST_CONFIG}\":${CHE_CONTAINER_ROOT} \ - alpine:3.4 sh -c \"rm -rf /root${CHE_CONTAINER_ROOT}/docs \ - && rm -rf /root${CHE_CONTAINER_ROOT}/instance \ - && rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env\"" + ${UTILITY_IMAGE_ALPINE} sh -c \"rm -rf /root${CHE_CONTAINER_ROOT}/docs \ + ; rm -rf /root${CHE_CONTAINER_ROOT}/instance \ + ; rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env\"" docker_run -v "${CHE_HOST_CONFIG}":/root${CHE_CONTAINER_ROOT} \ - alpine:3.4 sh -c "rm -rf /root${CHE_CONTAINER_ROOT}/docs \ - && rm -rf /root${CHE_CONTAINER_ROOT}/instance \ - && rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env" + ${UTILITY_IMAGE_ALPINE} sh -c "rm -rf /root${CHE_CONTAINER_ROOT}/docs \ + ; rm -rf /root${CHE_CONTAINER_ROOT}/instance \ + ; rm -rf /root${CHE_CONTAINER_ROOT}/${CHE_MINI_PRODUCT_NAME}.env" info "restore" "Recovering ${CHE_FORMAL_PRODUCT_NAME} data..." @@ -54,5 +54,5 @@ cmd_restore() { docker_run -v "${CHE_HOST_CONFIG}":/root${CHE_CONTAINER_ROOT} \ -v "${CHE_HOST_BACKUP}/${CHE_BACKUP_FILE_NAME}":"/root/backup/${CHE_BACKUP_FILE_NAME}" \ $(cmd_restore_extra_args) \ - alpine:3.4 sh -c "tar xf /root/backup/${CHE_BACKUP_FILE_NAME} -C /root${CHE_CONTAINER_ROOT}" + ${UTILITY_IMAGE_ALPINE} sh -c "tar xf /root/backup/${CHE_BACKUP_FILE_NAME} -C /root${CHE_CONTAINER_ROOT}" } diff --git a/dockerfiles/base/scripts/base/commands/cmd_start.sh b/dockerfiles/base/scripts/base/commands/cmd_start.sh index 4f33f56de42..a153705dbb5 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_start.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_start.sh @@ -59,7 +59,7 @@ cmd_start_check_ports() { # If dev mode is on, then we also need to check the debug port set by the user for availability if debug_server; then - USER_DEBUG_PORT=$(docker_run --env-file="${REFERENCE_CONTAINER_ENVIRONMENT_FILE}" alpine sh -c 'echo $CHE_DEBUG_PORT') + USER_DEBUG_PORT=$(docker_run --env-file="${REFERENCE_CONTAINER_ENVIRONMENT_FILE}" ${UTILITY_IMAGE_ALPINE} sh -c 'echo $CHE_DEBUG_PORT') if [[ "$USER_DEBUG_PORT" = "" ]]; then # If the user has not set a debug port, then use the default diff --git a/dockerfiles/base/scripts/base/commands/cmd_sync.sh b/dockerfiles/base/scripts/base/commands/cmd_sync.sh index 50672b67e61..b7cf562f5ca 100644 --- a/dockerfiles/base/scripts/base/commands/cmd_sync.sh +++ b/dockerfiles/base/scripts/base/commands/cmd_sync.sh @@ -22,6 +22,8 @@ cmd_sync() { return 2; fi + update_image_if_not_found ${UTILITY_IMAGE_CHEMOUNT} + # Determine the mount path to do the mount info "mount" "Starting sync process to ${SYNC_MOUNT}" @@ -30,7 +32,7 @@ cmd_sync() { -e CHE_VERSION=${CHE_VERSION} \ --name che-mount \ -v "${SYNC_MOUNT}":/mnthost \ - eclipse/che-mount:nightly $* + ${UTILITY_IMAGE_CHEMOUNT} $* # Docker doesn't seem to normally clean up this container docker rm -f che-mount diff --git a/dockerfiles/base/scripts/base/docker.sh b/dockerfiles/base/scripts/base/docker.sh index 181a63e6027..c642d5ce16d 100644 --- a/dockerfiles/base/scripts/base/docker.sh +++ b/dockerfiles/base/scripts/base/docker.sh @@ -287,6 +287,7 @@ check_mounts() { REPO_MOUNT=$(get_container_folder ":/repo") SYNC_MOUNT=$(get_container_folder ":/sync") UNISON_PROFILE_MOUNT=$(get_container_folder ":/unison") + CHEDIR_MOUNT=$(get_container_folder ":/chedir") if [[ "${DATA_MOUNT}" = "not set" ]]; then info "Welcome to $CHE_FORMAL_PRODUCT_NAME!" diff --git a/dockerfiles/base/scripts/base/startup.sh b/dockerfiles/base/scripts/base/startup.sh index 29f522a8827..b2216c4b0ec 100644 --- a/dockerfiles/base/scripts/base/startup.sh +++ b/dockerfiles/base/scripts/base/startup.sh @@ -82,6 +82,14 @@ init_constants() { DEFAULT_CHE_LICENSE=false CHE_LICENSE=${CHE_LICENSE:-${DEFAULT_CHE_LICENSE}} + + # Replace all of these with digests + UTILITY_IMAGE_ALPINE="alpine:3.4" + UTILITY_IMAGE_CHEIP="eclipse/che-ip:nightly" + UTILITY_IMAGE_CHEACTION="eclipse/che-action:nightly" + UTILITY_IMAGE_CHEDIR="eclipse/che-dir:nightly" + UTILITY_IMAGE_CHETEST="eclipse/che-test:nightly" + UTILITY_IMAGE_CHEMOUNT="eclipse/che-mount:nightly" } diff --git a/dockerfiles/cli/scripts/cli.sh b/dockerfiles/cli/scripts/cli.sh index 25a9aa43f09..2eb7242a277 100644 --- a/dockerfiles/cli/scripts/cli.sh +++ b/dockerfiles/cli/scripts/cli.sh @@ -7,7 +7,7 @@ # cli_pre_init() { - GLOBAL_HOST_IP=${GLOBAL_HOST_IP:=$(docker_run --net host eclipse/che-ip:nightly)} + GLOBAL_HOST_IP=${GLOBAL_HOST_IP:=$(docker_run --net host ${UTILITY_IMAGE_CHEIP})} DEFAULT_CHE_HOST=$GLOBAL_HOST_IP CHE_HOST=${CHE_HOST:-${DEFAULT_CHE_HOST}} DEFAULT_CHE_PORT=8080 diff --git a/dockerfiles/cli/scripts/entrypoint.sh b/dockerfiles/cli/scripts/entrypoint.sh index ae264c19609..e432dba690b 100755 --- a/dockerfiles/cli/scripts/entrypoint.sh +++ b/dockerfiles/cli/scripts/entrypoint.sh @@ -22,13 +22,14 @@ OPTIONAL DOCKER PARAMETERS: -v :/repo ${CHE_MINI_PRODUCT_NAME} git repo - uses local binaries -v :/sync Where remote ws files will be copied with sync command -v :/unison Where unison profile for optimizing sync command resides + -v :/chedir Soure repository to convert into workspace with Chedir utility COMMANDS: action Start action on ${CHE_MINI_PRODUCT_NAME} instance backup Backups ${CHE_MINI_PRODUCT_NAME} configuration and data to ${CHE_CONTAINER_ROOT}/backup volume mount config Generates a ${CHE_MINI_PRODUCT_NAME} config from vars; run on any start / restart destroy Stops services, and deletes ${CHE_MINI_PRODUCT_NAME} instance data - dir Use Chefile feature in the directory + dir Use Chedir and Chefile in the directory mounted to :/chedir download Pulls Docker images for the current ${CHE_MINI_PRODUCT_NAME} version help This message info Displays info about ${CHE_MINI_PRODUCT_NAME} and the CLI @@ -40,7 +41,7 @@ COMMANDS: ssh [machine-name] SSH to a workspace if SSH agent enabled start Starts ${CHE_MINI_PRODUCT_NAME} services stop Stops ${CHE_MINI_PRODUCT_NAME} services - sync Synchronize workspace with current working directory + sync Synchronize workspace with local directory mounted to :/sync test Start test on ${CHE_MINI_PRODUCT_NAME} instance upgrade Upgrades ${CHE_MINI_PRODUCT_NAME} from one version to another with migrations and backups version Installed version and upgrade paths