From 8dbffa2cc172e3795da2b2e98a2c62bef4db6f4f Mon Sep 17 00:00:00 2001 From: Mario Loriedo Date: Thu, 7 Jul 2016 14:45:32 +0200 Subject: [PATCH 1/3] Use a launcher image to simplify docker commands to start/stop/update/restart Che Signed-off-by: Mario Loriedo --- .dockerignore | 2 + dockerfiles/che/Dockerfile | 28 +++ dockerfiles/che/launcher.sh | 336 ++++++++++++++++++++++++++++++++++++ 3 files changed, 366 insertions(+) create mode 100644 dockerfiles/che/Dockerfile create mode 100755 dockerfiles/che/launcher.sh diff --git a/.dockerignore b/.dockerignore index f6b4c11464c..4af8888368a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,3 +2,5 @@ !assembly/assembly-main/target/eclipse-che-* assembly/assembly-main/target/eclipse-che-*.tar.gz assembly/assembly-main/target/eclipse-che-*.zip + +!assembly/assembly-main/src/assembly/bin/launcher.sh diff --git a/dockerfiles/che/Dockerfile b/dockerfiles/che/Dockerfile new file mode 100644 index 00000000000..5ad45088fe9 --- /dev/null +++ b/dockerfiles/che/Dockerfile @@ -0,0 +1,28 @@ +# +# To build it: +# `docker build -t codenvy/che .` +# +# To use it: +# `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock codenvy/che start` +# `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock codenvy/che stop` +# `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock codenvy/che restart` +# `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock codenvy/che update` +# + +FROM alpine:3.4 + +RUN apk add --no-cache \ + ca-certificates \ + curl \ + openssl + +ENV DOCKER_BUCKET get.docker.com +ENV DOCKER_VERSION 1.6.0 + +RUN set -x \ + && curl -sL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION" \ + > /usr/bin/docker; chmod +x /usr/bin/docker + +COPY /launcher.sh /bin/launcher.sh + +ENTRYPOINT ["bin/launcher.sh"] diff --git a/dockerfiles/che/launcher.sh b/dockerfiles/che/launcher.sh new file mode 100755 index 00000000000..17e91cda399 --- /dev/null +++ b/dockerfiles/che/launcher.sh @@ -0,0 +1,336 @@ +#!/bin/sh + +init_logging() { + BLUE='\033[1;34m' + GREEN='\033[0;32m' + RED='\033[0;31m' + NC='\033[0m' +} + +init_global_variables() { + + CHE_SERVER_CONTAINER_NAME="che" + CHE_SERVER_IMAGE_NAME="codenvy/che" + CHE_LAUNCER_IMAGE_NAME="codenvy/che-launcher" + + # Possible Docker install types are: + # native, boot2docker or moby + DOCKER_INSTALL_TYPE=$(get_docker_install_type) + + # User configurable variables + DEFAULT_CHE_HOSTNAME=$(get_che_hostname) + DEFAULT_CHE_PORT="8080" + DEFAULT_CHE_VERSION="latest" + DEFAULT_CHE_RESTART_POLICY="always" + DEFAULT_CHE_USER="root" + DEFAULT_DOCKER_HOST_IP=$(get_docker_host_ip) + DEFAULT_CHE_LOG_LEVEL="info" + DEFAULT_CHE_DATA_FOLDER="/home/user/che" + + CHE_HOSTNAME=${CHE_HOSTNAME:-${DEFAULT_CHE_HOSTNAME}} + CHE_PORT=${CHE_PORT:-${DEFAULT_CHE_PORT}} + CHE_VERSION=${CHE_VERSION:-${DEFAULT_CHE_VERSION}} + CHE_RESTART_POLICY=${CHE_RESTART_POLICY:-${DEFAULT_CHE_RESTART_POLICY}} + CHE_USER=${CHE_USER:-${DEFAULT_CHE_USER}} + DOCKER_HOST_IP=${DOCKER_HOST_IP:-${DEFAULT_DOCKER_HOST_IP}} + CHE_LOG_LEVEL=${CHE_LOG_LEVEL:-${DEFAULT_CHE_LOG_LEVEL}} + CHE_DATA_FOLDER=${CHE_DATA_FOLDER:-${DEFAULT_CHE_DATA_FOLDER}} + + # CHE_CONF_ARGS are the Docker run options that need to be used if users set CHE_CONF_FOLDER: + # - empty if CHE_CONF_FOLDER is not set + # - -v ${CHE_CONF_FOLDER}:/conf -e "CHE_LOCAL_CONF_DIR=/conf" if CHE_CONF_FOLDER is set + CHE_CONF_ARGS=${CHE_CONF_FOLDER:+-v ${CHE_CONF_FOLDER}:/conf -e \"CHE_LOCAL_CONF_DIR=/conf\"} + + + USAGE=" +Usage: + docker run -v /var/run/docker.sock:/var/run/docker.sock ${CHE_LAUNCER_IMAGE_NAME} [COMMAND] + start Starts Che server + stop Stops Che server + restart Restart Che server + update Pull latest version of ${CHE_SERVER_IMAGE_NAME} + info Print some debugging information + +Docs: http://eclipse.org/che/getting-started. +" +} + +usage () { + printf "%s" "${USAGE}" +} + +info() { + printf "${GREEN}INFO:${NC} %s\n" "${1}" +} + +debug() { + printf "${BLUE}DEBUG:${NC} %s\n" "${1}" +} + +error() { + printf "${RED}ERROR:${NC} %s\n" "${1}" +} + +error_exit() { + echo "---------------------------------------" + error "!!!" + error "!!! ${1}" + error "!!!" + echo "---------------------------------------" + exit 1 +} + +print_debug_info() { + debug "---------------------------------------" + debug "--------- CHE DEBUG INFO -----------" + debug "---------------------------------------" + debug "" + debug "DOCKER_INSTALL_TYPE = ${DOCKER_INSTALL_TYPE}" + debug "" + debug "CHE_SERVER_CONTAINER_NAME = ${CHE_SERVER_CONTAINER_NAME}" + debug "CHE_SERVER_IMAGE_NAME = ${CHE_SERVER_IMAGE_NAME}" + debug "" + VAL=$(if che_container_exist;then echo "YES"; else echo "NO"; fi) + debug "CHE CONTAINER EXISTS? ${VAL}" + VAL=$(if che_container_is_running;then echo "YES"; else echo "NO"; fi) + debug "CHE CONTAINER IS RUNNING? ${VAL}" + VAL=$(if che_container_is_stopped;then echo "YES"; else echo "NO"; fi) + debug "CHE CONTAINER IS STOPED? ${VAL}" + VAL=$(if server_is_booted;then echo "YES"; else echo "NO"; fi) + debug "CHE SERVER IS BOOTED? ${VAL}" + debug "" + debug "CHE_PORT = ${CHE_PORT}" + debug "CHE_VERSION = ${CHE_VERSION}" + debug "CHE_RESTART_POLICY = ${CHE_RESTART_POLICY}" + debug "CHE_USER = ${CHE_USER}" + debug "DOCKER_HOST_IP = ${DOCKER_HOST_IP}" + debug "CHE_LOG_LEVEL = ${CHE_LOG_LEVEL}" + debug "CHE_HOSTNAME = ${CHE_HOSTNAME}" + debug "CHE_DATA_FOLDER = ${CHE_DATA_FOLDER}" + debug "CHE_CONF_FOLDER = ${CHE_CONF_FOLDER:-not set}" + debug "---------------------------------------" + debug "---------------------------------------" + debug "---------------------------------------" +} + +get_docker_install_type() { + if uname -r | grep -q 'boot2docker'; then + echo "boot2docker" + elif uname -r | grep -q 'moby'; then + echo "moby" + else + echo "native" + fi +} + +get_docker_host_ip() { + NETWORK_IF="eth0" + INSTALL_TYPE=$(get_docker_install_type) + if [ "${INSTALL_TYPE}" = "boot2docker" ]; then + NETWORK_IF="eth1" + fi + + docker run --rm --net host \ + alpine sh -c \ + "ip a show ${NETWORK_IF}" | \ + grep 'inet ' | \ + cut -d/ -f1 | \ + awk '{ print $2}' +} + +get_che_hostname() { + INSTALL_TYPE=$(get_docker_install_type) + if [ "${INSTALL_TYPE}" = "boot2docker" ]; then + get_docker_host_ip + else + echo "localhost" + fi +} + +check_docker() { + if [ ! -S /var/run/docker.sock ]; then + error_exit "Docker socket (/var/run/docker.sock) hasn't be mounted \ +inside the container. Verify the syntax of the \"docker run\" command." + fi + + if ! docker ps > /dev/null 2>&1; then + output=$(docker ps) + error_exit "Error when running \"docker ps\": ${output}" + fi +} + +che_container_exist() { + if [ "$(docker ps -aq -f "name=${CHE_SERVER_CONTAINER_NAME}" | wc -l)" = "0" ]; then + return 1 + else + return 0 + fi +} + +che_container_is_running() { + if [ "$(docker ps -qa -f "status=running" -f "name=${CHE_SERVER_CONTAINER_NAME}" | wc -l)" = "0" ]; then + return 1 + else + return 0 + fi +} + +che_container_is_stopped() { + if [ "$(docker ps -qa -f "status=exited" -f "name=${CHE_SERVER_CONTAINER_NAME}" | wc -l)" = "0" ]; then + return 1 + else + return 0 + fi +} + +wait_until_container_is_running() { + CONTAINER_START_TIMEOUT=${1} + + ELAPSED=0 + until che_container_is_running || [ ${ELAPSED} -eq "${CONTAINER_START_TIMEOUT}" ]; do + sleep 1 + ELAPSED=$((ELAPSED+1)) + done +} + +server_is_booted() { + if ! curl -v http://"${DOCKER_HOST_IP}":"${CHE_PORT}"/dashboard > /dev/null 2>&1 ; then + return 1 + else + return 0 + fi +} + +wait_until_server_is_booted () { + SERVER_BOOT_TIMEOUT=${1} + + ELAPSED=0 + until server_is_booted || [ ${ELAPSED} -eq "${SERVER_BOOT_TIMEOUT}" ]; do + sleep 1 + ELAPSED=$((ELAPSED+1)) + done +} + +parse_command_line () { + if [ $# -eq 0 ]; then + usage + exit + fi + + for command_line_option in "$@"; do + case ${command_line_option} in + start|stop|restart|update|info) + CHE_SERVER_ACTION=${command_line_option} + ;; + -h|--help) + usage + exit + ;; + *) + # unknown option + error_exit "You passed an unknown command line option." + ;; + esac + done +} + +start_che_server() { + if che_container_exist; then + error_exit "A container named \"${CHE_SERVER_CONTAINER_NAME}\" already exists. Please remove it manually (docker rm -f ${CHE_SERVER_CONTAINER_NAME}) and try again." + fi + + info "------------------------------------" + info "ECLIPSE CHE: CONTAINER STARTING" + docker run -d --name "${CHE_SERVER_CONTAINER_NAME}" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "${CHE_DATA_FOLDER}"/lib:/home/user/che/lib-copy \ + -v "${CHE_DATA_FOLDER}"/workspaces:/home/user/che/workspaces \ + -v "${CHE_DATA_FOLDER}"/storage:/home/user/che/storage \ + -p "${CHE_PORT}":8080 \ + --restart="${CHE_RESTART_POLICY}" \ + --user="${CHE_USER}" ${CHE_CONF_ARGS} \ + "${CHE_SERVER_IMAGE_NAME}":"${CHE_VERSION}" \ + --remote:"${DOCKER_HOST_IP}" \ + -s:uid \ + run > /dev/null 2>&1 + + wait_until_container_is_running 10 + if ! che_container_is_running; then + error_exit "ECLIPSE CHE: Timeout waiting Che container to start." + fi + + info "ECLIPSE CHE: SERVER BOOTING" + info "ECLIPSE CHE: See logs at \"docker logs -f che\"" + wait_until_server_is_booted 20 + if server_is_booted; then + info "ECLIPSE CHE: BOOTED AND REACHABLE" + info "ECLIPSE CHE: http://${CHE_HOSTNAME}:${CHE_PORT}" + info "------------------------------------" + else + error_exit "ECLIPSE CHE: Timeout waiting Che server to boot. Run \"docker logs che\" to see the logs." + fi +} + +stop_che_server() { + if ! che_container_is_running; then + info "-------------------------------------------------------" + info "ECLIPSE CHE: CONTAINER IS NOT RUNNING. NOTHING TO DO." + info "-------------------------------------------------------" + else + info "---------------------------------------" + info "ECLIPSE CHE: STOPPING SERVER" + docker exec ${CHE_SERVER_CONTAINER_NAME} /home/user/che/bin/che.sh -c stop > /dev/null 2>&1 + sleep 5 + info "ECLIPSE CHE: REMOVING CONTAINER" + docker rm -f che > /dev/null 2>&1 + info "ECLIPSE CHE: STOPPED" + info "---------------------------------------" + fi +} + +restart_che_server() { + if che_container_is_running; then + stop_che_server + fi + start_che_server +} + +update_che_server() { + if [ -z "${CHE_VERSION}" ]; then + CHE_VERSION=${DEFAULT_CHE_VERSION} + fi + + info "---------------------------------------" + info "ECLIPSE CHE: PULLING ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} FROM REMOTE REGISTRY" + docker pull ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} > /dev/null 2>&1 + info "ECLIPSE CHE: IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} UPDATED" + info "PLEASE RESTART CHE TO COMPLETE THE UPDATE" + info "---------------------------------------" +} + +# See: https://sipb.mit.edu/doc/safe-shell/ +set -e +set -u + +init_logging +check_docker +init_global_variables +parse_command_line "$@" + +case ${CHE_SERVER_ACTION} in + start) + start_che_server + ;; + stop) + stop_che_server + ;; + restart) + restart_che_server + ;; + update) + update_che_server + ;; + info) + print_debug_info + ;; +esac From ff50a2953bb0f5b9724ebf0c6b133010cd6816af Mon Sep 17 00:00:00 2001 From: Tyler Jewell Date: Sat, 16 Jul 2016 05:15:49 -0700 Subject: [PATCH 2/3] Added new features to Launcher and introduced Che CLI Signed-off-by: Mario Loriedo --- .dockerignore | 2 - dockerfiles/che-cli/Dockerfile | 39 +++++ dockerfiles/che-cli/files-to-install/che.bat | 28 ++++ dockerfiles/che-cli/files-to-install/che.sh | 158 ++++++++++++++++++ dockerfiles/che-cli/install.sh | 9 + .../che-server/Dockerfile | 7 +- dockerfiles/che/Dockerfile | 2 +- dockerfiles/che/launcher.sh | 87 +++++++--- 8 files changed, 303 insertions(+), 29 deletions(-) create mode 100644 dockerfiles/che-cli/Dockerfile create mode 100644 dockerfiles/che-cli/files-to-install/che.bat create mode 100644 dockerfiles/che-cli/files-to-install/che.sh create mode 100644 dockerfiles/che-cli/install.sh rename Dockerfile => dockerfiles/che-server/Dockerfile (78%) diff --git a/.dockerignore b/.dockerignore index 4af8888368a..f6b4c11464c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,5 +2,3 @@ !assembly/assembly-main/target/eclipse-che-* assembly/assembly-main/target/eclipse-che-*.tar.gz assembly/assembly-main/target/eclipse-che-*.zip - -!assembly/assembly-main/src/assembly/bin/launcher.sh diff --git a/dockerfiles/che-cli/Dockerfile b/dockerfiles/che-cli/Dockerfile new file mode 100644 index 00000000000..817a705879e --- /dev/null +++ b/dockerfiles/che-cli/Dockerfile @@ -0,0 +1,39 @@ +# Copyright (c) 2012-2016 Codenvy, S.A. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Codenvy, S.A. - Initial implementation +# +# To build, in this directory: +# `docker build -t codenvy/che-cli .` +# +# Use it to install files into current directory with Windows: +# set f=%~dp0:\=/%&set h=%g::=%&set i=/%h% +# for /l %%a in (1,1,100) do if "!i:~-1!"==" " set i=!i:~0,-1! +# docker run -v %i%:/che codenvy/che-cli +# +# Use it to install files into current directory with Linux / Mac: +# docker run -v $(pwd):/che codenvy/che-cli +# +FROM alpine:3.4 + +RUN apk add --no-cache \ + ca-certificates \ + curl \ + openssl + +ENV DOCKER_BUCKET get.docker.com +ENV DOCKER_VERSION 1.6.0 + +RUN set -x \ + && curl -sL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION" \ + > /usr/bin/docker; chmod +x /usr/bin/docker + +COPY files-to-install che + +COPY /install.sh /bin/install.sh + +ENTRYPOINT ["bin/install.sh"] diff --git a/dockerfiles/che-cli/files-to-install/che.bat b/dockerfiles/che-cli/files-to-install/che.bat new file mode 100644 index 00000000000..c85e97f6420 --- /dev/null +++ b/dockerfiles/che-cli/files-to-install/che.bat @@ -0,0 +1,28 @@ +@REM +@REM Copyright (c) 2012-2016 Codenvy, S.A. +@REM All rights reserved. This program and the accompanying materials +@REM are made available under the terms of the Eclipse Public License v1.0 +@REM which accompanies this distribution, and is available at +@REM http://www.eclipse.org/legal/epl-v10.html +@REM +@REM Contributors: +@REM Codenvy, S.A. - initial API and implementation +@REM + +@echo off + +REM Check to ensure bash is installed +CALL bash --help > nul 2>&1 +IF %ERRORLEVEL% NEQ 0 goto setup + +REM Launch Che and any associated docker machines, if necessary +CALL bash --login -i "%~dp0\che.sh" %* + +goto end + +:setup +echo. +echo "REQUIRED: Git bash for Windows. It is typically stored c:\Program Files\Git\bin." +echo. + +:end diff --git a/dockerfiles/che-cli/files-to-install/che.sh b/dockerfiles/che-cli/files-to-install/che.sh new file mode 100644 index 00000000000..0df8bd26dbf --- /dev/null +++ b/dockerfiles/che-cli/files-to-install/che.sh @@ -0,0 +1,158 @@ +#!/bin/sh +# Copyright (c) 2012-2016 Codenvy, S.A. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html + +init_logging() { + BLUE='\033[1;34m' + GREEN='\033[0;32m' + RED='\033[0;31m' + NC='\033[0m' +} + +init_global_variables() { + + CHE_LAUNCHER_CONTAINER_NAME="che-launcher" + CHE_LAUNCHER_IMAGE_NAME="che-launcher" + + # User configurable variables + DEFAULT_CHE_VERSION="latest" + DEFAULT_CHE_CLI_ACTION="help" + + CHE_VERSION=${CHE_VERSION:-${DEFAULT_CHE_VERSION}} + CHE_CLI_ACTION=${CHE_CLI_ACTION:-${DEFAULT_CHE_CLI_ACTION}} + + USAGE=" +Usage: + che [COMMAND] + start Starts Che server + stop Stops Che server + restart Restart Che server + update Pull latest version of ${CHE_LAUNCHER_IMAGE_NAME} + info Print some debugging information + +Docs: http://eclipse.org/che/getting-started. +" +} + +usage () { + printf "%s" "${USAGE}" +} + +info() { + printf "${GREEN}INFO:${NC} %s\n" "${1}" +} + +debug() { + printf "${BLUE}DEBUG:${NC} %s\n" "${1}" +} + +error() { + printf "${RED}ERROR:${NC} %s\n" "${1}" +} + +error_exit() { + echo "---------------------------------------" + error "!!!" + error "!!! ${1}" + error "!!!" + echo "---------------------------------------" + exit 1 +} + +check_docker() { + if ! docker ps > /dev/null 2>&1; then + output=$(docker) + error_exit "Error - Docker not installed properly: ${output}" + fi +} + +parse_command_line () { + for command_line_option in "$@"; do + case ${command_line_option} in + start|stop|restart|update|info|-h|--help) + CHE_CLI_ACTION=${command_line_option} + ;; + *) + # unknown option + error_exit "You passed an unknown command line option." + ;; + esac + done +} + +execute_che_launcher() { + + update_che_launcher + + info "ECLIPSE CHE: LAUNCHING LAUNCHER" + docker run -it --rm --name "${CHE_LAUNCHER_CONTAINER_NAME}" \ + -v //var//run//docker.sock://var//run//docker.sock \ + "${CHE_LAUNCHER_IMAGE_NAME}":"${CHE_VERSION}" "${CHE_CLI_ACTION}" \ + # > /dev/null 2>&1 +} + +execute_command_with_progress() { + local progress=$1 + local command=$2 + shift 2 + + local pid="" + printf "\n" + + case "$progress" in + extended) + $command "$@" + ;; + basic|*) + $command "$@" &>/dev/null & + pid=$! + while kill -0 "$pid" >/dev/null 2>&1; do + printf "#" + sleep 10 + done + wait $pid # return pid's exit code + printf "\n" + ;; + esac + printf "\n" +} + +update_che_launcher() { + if [ -z "${CHE_VERSION}" ]; then + CHE_VERSION=${DEFAULT_CHE_VERSION} + fi + + CURRENT_IMAGE=$(docker images -q ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}) + + if [ "${CURRENT_IMAGE}" != "" ]; then + info "ECLIPSE CHE: ALREADY HAVE IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}" + else + info "ECLIPSE CHE: PULLING IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}" + execute_command_with_progress extended docker pull ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION} + info "ECLIPSE CHE: IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION} INSTALLED" + fi +} + +# See: https://sipb.mit.edu/doc/safe-shell/ +set -e +set -u + +init_logging +check_docker +init_global_variables +parse_command_line "$@" + +case ${CHE_CLI_ACTION} in + start|stop|restart|update|info) + execute_che_launcher + ;; + update-cli) + update_che_launcher + ;; + help) + usage + ;; +esac diff --git a/dockerfiles/che-cli/install.sh b/dockerfiles/che-cli/install.sh new file mode 100644 index 00000000000..197c4593e51 --- /dev/null +++ b/dockerfiles/che-cli/install.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# Copyright (c) 2012-2016 Codenvy, S.A. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +cd /che +yes | cp -rf /che/files-to-install/* /che diff --git a/Dockerfile b/dockerfiles/che-server/Dockerfile similarity index 78% rename from Dockerfile rename to dockerfiles/che-server/Dockerfile index 9123be5ec38..171e8b0dfe7 100644 --- a/Dockerfile +++ b/dockerfiles/che-server/Dockerfile @@ -1,3 +1,8 @@ +# +# To build it, run in the repository root: +# `docker build -t codenvy/che-server -f $(pwd)/dockerfiles/che-server/Dockerfile .` +# + FROM alpine:3.4 ENV LANG=C.UTF-8 \ @@ -21,7 +26,7 @@ EXPOSE 8000 8080 USER user -ADD /assembly/assembly-main/target/eclipse-che-*/eclipse-che-* /home/user/che/ +ADD assembly/assembly-main/target/eclipse-che-*/eclipse-che-* /home/user/che/ ENV CHE_HOME /home/user/che diff --git a/dockerfiles/che/Dockerfile b/dockerfiles/che/Dockerfile index 5ad45088fe9..8dcc2d5995a 100644 --- a/dockerfiles/che/Dockerfile +++ b/dockerfiles/che/Dockerfile @@ -1,5 +1,5 @@ # -# To build it: +# To build, in this directory: # `docker build -t codenvy/che .` # # To use it: diff --git a/dockerfiles/che/launcher.sh b/dockerfiles/che/launcher.sh index 17e91cda399..3fda4010434 100755 --- a/dockerfiles/che/launcher.sh +++ b/dockerfiles/che/launcher.sh @@ -9,7 +9,7 @@ init_logging() { init_global_variables() { - CHE_SERVER_CONTAINER_NAME="che" + CHE_SERVER_CONTAINER_NAME="che-server" CHE_SERVER_IMAGE_NAME="codenvy/che" CHE_LAUNCER_IMAGE_NAME="codenvy/che-launcher" @@ -18,12 +18,12 @@ init_global_variables() { DOCKER_INSTALL_TYPE=$(get_docker_install_type) # User configurable variables + DEFAULT_DOCKER_HOST_IP=$(get_docker_host_ip) DEFAULT_CHE_HOSTNAME=$(get_che_hostname) DEFAULT_CHE_PORT="8080" DEFAULT_CHE_VERSION="latest" DEFAULT_CHE_RESTART_POLICY="always" DEFAULT_CHE_USER="root" - DEFAULT_DOCKER_HOST_IP=$(get_docker_host_ip) DEFAULT_CHE_LOG_LEVEL="info" DEFAULT_CHE_DATA_FOLDER="/home/user/che" @@ -32,7 +32,7 @@ init_global_variables() { CHE_VERSION=${CHE_VERSION:-${DEFAULT_CHE_VERSION}} CHE_RESTART_POLICY=${CHE_RESTART_POLICY:-${DEFAULT_CHE_RESTART_POLICY}} CHE_USER=${CHE_USER:-${DEFAULT_CHE_USER}} - DOCKER_HOST_IP=${DOCKER_HOST_IP:-${DEFAULT_DOCKER_HOST_IP}} + CHE_HOST_IP=${CHE_HOST_IP:-${DEFAULT_DOCKER_HOST_IP}} CHE_LOG_LEVEL=${CHE_LOG_LEVEL:-${DEFAULT_CHE_LOG_LEVEL}} CHE_DATA_FOLDER=${CHE_DATA_FOLDER:-${DEFAULT_CHE_DATA_FOLDER}} @@ -40,7 +40,7 @@ init_global_variables() { # - empty if CHE_CONF_FOLDER is not set # - -v ${CHE_CONF_FOLDER}:/conf -e "CHE_LOCAL_CONF_DIR=/conf" if CHE_CONF_FOLDER is set CHE_CONF_ARGS=${CHE_CONF_FOLDER:+-v ${CHE_CONF_FOLDER}:/conf -e \"CHE_LOCAL_CONF_DIR=/conf\"} - + CHE_LOCAL_BINARY_ARGS=${CHE_LOCAL_BINARY:+-v ${CHE_LOCAL_BINARY}:/home/user/che} USAGE=" Usage: @@ -95,7 +95,7 @@ print_debug_info() { VAL=$(if che_container_is_running;then echo "YES"; else echo "NO"; fi) debug "CHE CONTAINER IS RUNNING? ${VAL}" VAL=$(if che_container_is_stopped;then echo "YES"; else echo "NO"; fi) - debug "CHE CONTAINER IS STOPED? ${VAL}" + debug "CHE CONTAINER IS STOPPED? ${VAL}" VAL=$(if server_is_booted;then echo "YES"; else echo "NO"; fi) debug "CHE SERVER IS BOOTED? ${VAL}" debug "" @@ -103,11 +103,13 @@ print_debug_info() { debug "CHE_VERSION = ${CHE_VERSION}" debug "CHE_RESTART_POLICY = ${CHE_RESTART_POLICY}" debug "CHE_USER = ${CHE_USER}" - debug "DOCKER_HOST_IP = ${DOCKER_HOST_IP}" + debug "CHE_HOST_IP = ${CHE_HOST_IP}" debug "CHE_LOG_LEVEL = ${CHE_LOG_LEVEL}" debug "CHE_HOSTNAME = ${CHE_HOSTNAME}" debug "CHE_DATA_FOLDER = ${CHE_DATA_FOLDER}" debug "CHE_CONF_FOLDER = ${CHE_CONF_FOLDER:-not set}" + debug "CHE_LOCAL_BINARY = ${CHE_LOCAL_BINARY:-not set}" + debug "" debug "---------------------------------------" debug "---------------------------------------" debug "---------------------------------------" @@ -140,8 +142,12 @@ get_docker_host_ip() { get_che_hostname() { INSTALL_TYPE=$(get_docker_install_type) + CHE_IP=$(get_docker_host_ip) + if [ "${INSTALL_TYPE}" = "boot2docker" ]; then - get_docker_host_ip + echo "${CHE_IP}" + elif [[ "${INSTALL_TYPE}" = "moby" && "${CHE_IP}" = "10.0.75.2" ]]; then + echo "${CHE_IP}" else echo "localhost" fi @@ -194,7 +200,7 @@ wait_until_container_is_running() { } server_is_booted() { - if ! curl -v http://"${DOCKER_HOST_IP}":"${CHE_PORT}"/dashboard > /dev/null 2>&1 ; then + if ! curl -v http://"${CHE_HOST_IP}":"${CHE_PORT}"/dashboard > /dev/null 2>&1 ; then return 1 else return 0 @@ -239,52 +245,86 @@ start_che_server() { error_exit "A container named \"${CHE_SERVER_CONTAINER_NAME}\" already exists. Please remove it manually (docker rm -f ${CHE_SERVER_CONTAINER_NAME}) and try again." fi - info "------------------------------------" + CURRENT_IMAGE=$(docker images -q ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION}) + + if [ "${CURRENT_IMAGE}" != "" ]; then + info "ECLIPSE CHE: ALREADY HAVE IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION}" + else + update_che_server + fi + info "ECLIPSE CHE: CONTAINER STARTING" docker run -d --name "${CHE_SERVER_CONTAINER_NAME}" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "${CHE_DATA_FOLDER}"/lib:/home/user/che/lib-copy \ -v "${CHE_DATA_FOLDER}"/workspaces:/home/user/che/workspaces \ -v "${CHE_DATA_FOLDER}"/storage:/home/user/che/storage \ + ${CHE_LOCAL_BINARY_ARGS} \ -p "${CHE_PORT}":8080 \ --restart="${CHE_RESTART_POLICY}" \ - --user="${CHE_USER}" ${CHE_CONF_ARGS} \ + --user="${CHE_USER}" \ + ${CHE_CONF_ARGS} \ "${CHE_SERVER_IMAGE_NAME}":"${CHE_VERSION}" \ - --remote:"${DOCKER_HOST_IP}" \ + --remote:"${CHE_HOST_IP}" \ -s:uid \ - run > /dev/null 2>&1 + -s:client \ + run > /dev/null # 2>&1 wait_until_container_is_running 10 if ! che_container_is_running; then error_exit "ECLIPSE CHE: Timeout waiting Che container to start." fi - info "ECLIPSE CHE: SERVER BOOTING" - info "ECLIPSE CHE: See logs at \"docker logs -f che\"" + info "ECLIPSE CHE: SERVER LOGS AT \"docker logs -f che\"" + info "ECLIPSE CHE: SERVER BOOTING..." wait_until_server_is_booted 20 + if server_is_booted; then info "ECLIPSE CHE: BOOTED AND REACHABLE" info "ECLIPSE CHE: http://${CHE_HOSTNAME}:${CHE_PORT}" - info "------------------------------------" else error_exit "ECLIPSE CHE: Timeout waiting Che server to boot. Run \"docker logs che\" to see the logs." fi } +execute_command_with_progress() { + local progress=$1 + local command=$2 + shift 2 + + local pid="" + printf "\n" + + case "$progress" in + extended) + $command "$@" + ;; + basic|*) + $command "$@" &>/dev/null & + pid=$! + while kill -0 "$pid" >/dev/null 2>&1; do + printf "#" + sleep 10 + done + wait $pid # return pid's exit code + printf "\n" + ;; + esac + printf "\n" +} + stop_che_server() { if ! che_container_is_running; then info "-------------------------------------------------------" info "ECLIPSE CHE: CONTAINER IS NOT RUNNING. NOTHING TO DO." info "-------------------------------------------------------" else - info "---------------------------------------" - info "ECLIPSE CHE: STOPPING SERVER" + info "ECLIPSE CHE: STOPPING SERVER..." docker exec ${CHE_SERVER_CONTAINER_NAME} /home/user/che/bin/che.sh -c stop > /dev/null 2>&1 sleep 5 info "ECLIPSE CHE: REMOVING CONTAINER" - docker rm -f che > /dev/null 2>&1 + docker rm -f ${CHE_SERVER_CONTAINER_NAME} > /dev/null 2>&1 info "ECLIPSE CHE: STOPPED" - info "---------------------------------------" fi } @@ -300,12 +340,9 @@ update_che_server() { CHE_VERSION=${DEFAULT_CHE_VERSION} fi - info "---------------------------------------" - info "ECLIPSE CHE: PULLING ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} FROM REMOTE REGISTRY" - docker pull ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} > /dev/null 2>&1 - info "ECLIPSE CHE: IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} UPDATED" - info "PLEASE RESTART CHE TO COMPLETE THE UPDATE" - info "---------------------------------------" + info "ECLIPSE CHE: PULLING IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION}" + execute_command_with_progress extended docker pull ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} + info "ECLIPSE CHE: IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION} INSTALLED" } # See: https://sipb.mit.edu/doc/safe-shell/ From 61b6442d3f2a60558dbb81eb6c9f430df8389ffd Mon Sep 17 00:00:00 2001 From: Mario Loriedo Date: Mon, 18 Jul 2016 11:37:58 +0200 Subject: [PATCH 3/3] Improvements to launcher.sh after code reviews and che-dev Docker image Signed-off-by: Mario Loriedo --- Vagrantfile | 21 ++- dockerfiles/che-cli/files-to-install/che.sh | 16 +-- dockerfiles/che-dev/Dockerfile | 70 ++++++++++ dockerfiles/{che => che-launcher}/Dockerfile | 10 +- dockerfiles/{che => che-launcher}/launcher.sh | 125 +++++++++++++----- dockerfiles/che-server/Dockerfile | 8 ++ 6 files changed, 196 insertions(+), 54 deletions(-) create mode 100644 dockerfiles/che-dev/Dockerfile rename dockerfiles/{che => che-launcher}/Dockerfile (65%) rename dockerfiles/{che => che-launcher}/launcher.sh (77%) diff --git a/Vagrantfile b/Vagrantfile index 48ce0e5f5da..8caa9e844ad 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -106,9 +106,9 @@ Vagrant.configure(2) do |config| local progress=$1 local command=$2 shift 2 - + local pid="" - + case "$progress" in extended) # simulate tty environment to get full output of progress bars and percentages @@ -125,7 +125,7 @@ Vagrant.configure(2) do |config| ;; esac } - + echo "------------------------------------" echo "ECLIPSE CHE: UPGRADING DOCKER ENGINE" echo "------------------------------------" @@ -136,7 +136,7 @@ Vagrant.configure(2) do |config| perform $PROVISION_PROGRESS sudo yum -y update docker-engine echo $(docker --version) - + # Add the 'vagrant' user to the 'docker' group usermod -aG docker vagrant &>/dev/null @@ -178,7 +178,7 @@ Vagrant.configure(2) do |config| `codenvy/che:${CHE_VERSION} --remote:${IP} --port:${PORT} run &>/dev/null SHELL - config.vm.provision "shell" do |s| + config.vm.provision "shell" do |s| s.inline = $script s.args = [$http_proxy, $https_proxy, $no_proxy, $che_version, $ip, $containerPort, $provisionProgress] end @@ -198,20 +198,19 @@ Vagrant.configure(2) do |config| CHE_URL="http://${IP}:${PORT}" # Test the default dashboard page to see when it returns a non-error value. - # Che is active once it returns success + # Che is active once it returns success while [ true ]; do printf "#" - curl -v ${CHE_URL}/dashboard &>/dev/null - exitcode=$? - if [ $exitcode == "0" ]; then + http_status_code=$(curl -I ${CHE_URL}/api/ -s -o /dev/null --write-out "%{http_code}") + if [ "$http_status_code" == "200" ]; then echo "${CHE_URL}" > /home/user/che/.che_url echo "${MAPPED_PORT}" > /home/user/che/.che_host_port echo "---------------------------------------" echo "ECLIPSE CHE: BOOTED AND REACHABLE" echo "ECLIPSE CHE: ${CHE_URL} " echo "---------------------------------------" - exit 0 - fi + exit 0 + fi sleep 10 done SHELL diff --git a/dockerfiles/che-cli/files-to-install/che.sh b/dockerfiles/che-cli/files-to-install/che.sh index 0df8bd26dbf..8cd20d7e803 100644 --- a/dockerfiles/che-cli/files-to-install/che.sh +++ b/dockerfiles/che-cli/files-to-install/che.sh @@ -20,10 +20,10 @@ init_global_variables() { # User configurable variables DEFAULT_CHE_VERSION="latest" DEFAULT_CHE_CLI_ACTION="help" - + CHE_VERSION=${CHE_VERSION:-${DEFAULT_CHE_VERSION}} CHE_CLI_ACTION=${CHE_CLI_ACTION:-${DEFAULT_CHE_CLI_ACTION}} - + USAGE=" Usage: che [COMMAND] @@ -98,13 +98,13 @@ execute_command_with_progress() { local progress=$1 local command=$2 shift 2 - + local pid="" - printf "\n" + printf "\n" case "$progress" in extended) - $command "$@" + $command "$@" ;; basic|*) $command "$@" &>/dev/null & @@ -117,7 +117,7 @@ execute_command_with_progress() { printf "\n" ;; esac - printf "\n" + printf "\n" } update_che_launcher() { @@ -127,9 +127,9 @@ update_che_launcher() { CURRENT_IMAGE=$(docker images -q ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}) - if [ "${CURRENT_IMAGE}" != "" ]; then + if [ "${CURRENT_IMAGE}" != "" ]; then info "ECLIPSE CHE: ALREADY HAVE IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}" - else + else info "ECLIPSE CHE: PULLING IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION}" execute_command_with_progress extended docker pull ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION} info "ECLIPSE CHE: IMAGE ${CHE_LAUNCHER_IMAGE_NAME}:${CHE_VERSION} INSTALLED" diff --git a/dockerfiles/che-dev/Dockerfile b/dockerfiles/che-dev/Dockerfile new file mode 100644 index 00000000000..47f530a0270 --- /dev/null +++ b/dockerfiles/che-dev/Dockerfile @@ -0,0 +1,70 @@ +# Copyright (c) 2012-2016 Codenvy, S.A., Red Hat, Inc. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Codenvy, S.A. - initial API and implementation +# Mario Loriedo +# +# To build, in this directory: +# docker build -t codenvy/che-dev . +# +# Use it to Build Che using Docker on Linux or Mac. Run int the repository root: +# docker run -it --rm --name build-che +# -v "$HOME/.m2:/home/user/.m2" +# -v "$PWD":/home/user/che-build +# -w /home/user/che-build +# codenvy/che-dev +# mvn -DskipTests=true +# -Dfindbugs.skip=true +# -Dgwt.compiler.localWorkers=2 -T 1C +# -Dskip-validate-sources +# clean install +# +# For Windows, replace $HOME with maven repo directory. +# For Windows, replace $PWD with Che source code directory. +# + +FROM codenvy/debian_jdk8 +ENV NODE_VERSION=0.12.9 \ + NODE_PATH=/usr/local/lib/node_modules + +RUN sudo apt-get update && \ + sudo apt-get -y install build-essential libssl-dev libkrb5-dev gcc make ruby-full rubygems && \ + sudo gem install sass compass && \ + sudo apt-get clean && \ + sudo apt-get -y autoremove && \ + sudo apt-get -y clean && \ + sudo rm -rf /var/lib/apt/lists/* && \ + set -ex \ + && for key in \ + 9554F04D7259F04124DE6B476D5A82AC7E37093B \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + ; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done && \ + cd /home/user && curl --insecure -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \ + && curl --insecure -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --verify SHASUMS256.txt.asc \ + && grep "node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \ + && sudo tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ + && sudo rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc + +EXPOSE 3000 5000 9000 +RUN sudo npm install -g npm@latest +RUN sudo npm install --unsafe-perm -g gulp bower +RUN mkdir ~/gopath && \ + cd /home/user && wget -q https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz && \ + sudo tar -xvf go1.6.2.linux-amd64.tar.gz -C /opt/ && \ + rm go1.6.2.linux-amd64.tar.gz +ENV GOROOT=/opt/go +ENV GOPATH=/home/user/gopath +RUN echo "export PATH=$GOROOT/bin:$PATH" >> ~/.bashrc && \ + sudo chown -R user:user /opt +WORKDIR /home/user diff --git a/dockerfiles/che/Dockerfile b/dockerfiles/che-launcher/Dockerfile similarity index 65% rename from dockerfiles/che/Dockerfile rename to dockerfiles/che-launcher/Dockerfile index 8dcc2d5995a..2d25f8c1643 100644 --- a/dockerfiles/che/Dockerfile +++ b/dockerfiles/che-launcher/Dockerfile @@ -1,6 +1,14 @@ +# Copyright (c) 2012-2016 Codenvy, S.A., Red Hat, Inc +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Mario Loriedo - Initial implementation # # To build, in this directory: -# `docker build -t codenvy/che .` +# `docker build -t codenvy/che-launcher .` # # To use it: # `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock codenvy/che start` diff --git a/dockerfiles/che/launcher.sh b/dockerfiles/che-launcher/launcher.sh similarity index 77% rename from dockerfiles/che/launcher.sh rename to dockerfiles/che-launcher/launcher.sh index 3fda4010434..12926184a53 100755 --- a/dockerfiles/che/launcher.sh +++ b/dockerfiles/che-launcher/launcher.sh @@ -1,4 +1,13 @@ #!/bin/sh +# Copyright (c) 2012-2016 Codenvy, S.A., Red Hat, Inc +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Mario Loriedo - Initial implementation +# init_logging() { BLUE='\033[1;34m' @@ -10,8 +19,8 @@ init_logging() { init_global_variables() { CHE_SERVER_CONTAINER_NAME="che-server" - CHE_SERVER_IMAGE_NAME="codenvy/che" - CHE_LAUNCER_IMAGE_NAME="codenvy/che-launcher" + CHE_SERVER_IMAGE_NAME="codenvy/che-server" + CHE_LAUNCHER_IMAGE_NAME="codenvy/che-launcher" # Possible Docker install types are: # native, boot2docker or moby @@ -22,7 +31,7 @@ init_global_variables() { DEFAULT_CHE_HOSTNAME=$(get_che_hostname) DEFAULT_CHE_PORT="8080" DEFAULT_CHE_VERSION="latest" - DEFAULT_CHE_RESTART_POLICY="always" + DEFAULT_CHE_RESTART_POLICY="no" DEFAULT_CHE_USER="root" DEFAULT_CHE_LOG_LEVEL="info" DEFAULT_CHE_DATA_FOLDER="/home/user/che" @@ -42,9 +51,24 @@ init_global_variables() { CHE_CONF_ARGS=${CHE_CONF_FOLDER:+-v ${CHE_CONF_FOLDER}:/conf -e \"CHE_LOCAL_CONF_DIR=/conf\"} CHE_LOCAL_BINARY_ARGS=${CHE_LOCAL_BINARY:+-v ${CHE_LOCAL_BINARY}:/home/user/che} + if is_docker_for_mac || is_docker_for_windows; then + CHE_STORAGE_ARGS=${CHE_DATA_FOLDER:+-v ${CHE_DATA_FOLDER}/storage:/home/user/che/storage \ + -e \"CHE_WORKSPACE_STORAGE=${CHE_DATA_FOLDER}/workspaces\" \ + -e \"CHE_WORKSPACE_STORAGE_CREATE_FOLDERS=false\"} + else + CHE_STORAGE_ARGS=${CHE_DATA_FOLDER:+-v ${CHE_DATA_FOLDER}/storage:/home/user/che/storage \ + -v ${CHE_DATA_FOLDER}/workspaces:/home/user/che/workspaces} + fi + + if [ "${CHE_LOG_LEVEL}" = "debug" ]; then + CHE_DEBUG_OPTION="--debug --log_level:debug" + else + CHE_DEBUG_OPTION="" + fi + USAGE=" Usage: - docker run -v /var/run/docker.sock:/var/run/docker.sock ${CHE_LAUNCER_IMAGE_NAME} [COMMAND] + docker run -v /var/run/docker.sock:/var/run/docker.sock ${CHE_LAUNCHER_IMAGE_NAME} [COMMAND] start Starts Che server stop Stops Che server restart Restart Che server @@ -115,11 +139,46 @@ print_debug_info() { debug "---------------------------------------" } -get_docker_install_type() { +is_boot2docker() { if uname -r | grep -q 'boot2docker'; then + return 0 + else + return 1 + fi +} + +has_docker_for_windows_ip() { + DOCKER_HOST_IP=$(get_docker_host_ip) + if [ "${DOCKER_HOST_IP}" = "10.0.75.2" ]; then + return 0 + else + return 1 + fi +} + +is_docker_for_mac() { + if uname -r | grep -q 'moby' && ! has_docker_for_windows_ip; then + return 0 + else + return 1 + fi +} + +is_docker_for_windows() { + if uname -r | grep -q 'moby' && has_docker_for_windows_ip; then + return 0 + else + return 1 + fi +} + +get_docker_install_type() { + if is_boot2docker; then echo "boot2docker" - elif uname -r | grep -q 'moby'; then - echo "moby" + elif is_docker_for_windows; then + echo "docker4windows" + elif is_docker_for_mac; then + echo "docker4mac" else echo "native" fi @@ -127,8 +186,7 @@ get_docker_install_type() { get_docker_host_ip() { NETWORK_IF="eth0" - INSTALL_TYPE=$(get_docker_install_type) - if [ "${INSTALL_TYPE}" = "boot2docker" ]; then + if is_boot2docker; then NETWORK_IF="eth1" fi @@ -142,12 +200,9 @@ get_docker_host_ip() { get_che_hostname() { INSTALL_TYPE=$(get_docker_install_type) - CHE_IP=$(get_docker_host_ip) - - if [ "${INSTALL_TYPE}" = "boot2docker" ]; then - echo "${CHE_IP}" - elif [[ "${INSTALL_TYPE}" = "moby" && "${CHE_IP}" = "10.0.75.2" ]]; then - echo "${CHE_IP}" + if [ "${INSTALL_TYPE}" = "boot2docker" ] || + [ "${INSTALL_TYPE}" = "docker4windows" ]; then + get_docker_host_ip else echo "localhost" fi @@ -200,10 +255,12 @@ wait_until_container_is_running() { } server_is_booted() { - if ! curl -v http://"${CHE_HOST_IP}":"${CHE_PORT}"/dashboard > /dev/null 2>&1 ; then - return 1 - else + HTTP_STATUS_CODE=$(curl -I http://"${CHE_HOST_IP}":"${CHE_PORT}"/api/ \ + -s -o /dev/null --write-out "%{http_code}") + if [ "${HTTP_STATUS_CODE}" = "200" ]; then return 0 + else + return 1 fi } @@ -245,37 +302,37 @@ start_che_server() { error_exit "A container named \"${CHE_SERVER_CONTAINER_NAME}\" already exists. Please remove it manually (docker rm -f ${CHE_SERVER_CONTAINER_NAME}) and try again." fi - CURRENT_IMAGE=$(docker images -q ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION}) + CURRENT_IMAGE=$(docker images -q "${CHE_SERVER_IMAGE_NAME}":"${CHE_VERSION}") - if [ "${CURRENT_IMAGE}" != "" ]; then + if [ "${CURRENT_IMAGE}" != "" ]; then info "ECLIPSE CHE: ALREADY HAVE IMAGE ${CHE_SERVER_IMAGE_NAME}:${CHE_VERSION}" - else + else update_che_server fi info "ECLIPSE CHE: CONTAINER STARTING" docker run -d --name "${CHE_SERVER_CONTAINER_NAME}" \ -v /var/run/docker.sock:/var/run/docker.sock \ - -v "${CHE_DATA_FOLDER}"/lib:/home/user/che/lib-copy \ - -v "${CHE_DATA_FOLDER}"/workspaces:/home/user/che/workspaces \ - -v "${CHE_DATA_FOLDER}"/storage:/home/user/che/storage \ + -v /home/user/che/lib:/home/user/che/lib-copy \ ${CHE_LOCAL_BINARY_ARGS} \ -p "${CHE_PORT}":8080 \ --restart="${CHE_RESTART_POLICY}" \ --user="${CHE_USER}" \ ${CHE_CONF_ARGS} \ + ${CHE_STORAGE_ARGS} \ "${CHE_SERVER_IMAGE_NAME}":"${CHE_VERSION}" \ --remote:"${CHE_HOST_IP}" \ -s:uid \ -s:client \ - run > /dev/null # 2>&1 + ${CHE_DEBUG_OPTION} \ + run > /dev/null wait_until_container_is_running 10 if ! che_container_is_running; then error_exit "ECLIPSE CHE: Timeout waiting Che container to start." fi - info "ECLIPSE CHE: SERVER LOGS AT \"docker logs -f che\"" + info "ECLIPSE CHE: SERVER LOGS AT \"docker logs -f ${CHE_SERVER_CONTAINER_NAME}\"" info "ECLIPSE CHE: SERVER BOOTING..." wait_until_server_is_booted 20 @@ -283,21 +340,21 @@ start_che_server() { info "ECLIPSE CHE: BOOTED AND REACHABLE" info "ECLIPSE CHE: http://${CHE_HOSTNAME}:${CHE_PORT}" else - error_exit "ECLIPSE CHE: Timeout waiting Che server to boot. Run \"docker logs che\" to see the logs." + error_exit "ECLIPSE CHE: Timeout waiting Che server to boot. Run \"docker logs ${CHE_SERVER_CONTAINER_NAME}\" to see the logs." fi } execute_command_with_progress() { - local progress=$1 - local command=$2 + progress=$1 + command=$2 shift 2 - - local pid="" - printf "\n" + + pid="" + printf "\n" case "$progress" in extended) - $command "$@" + $command "$@" ;; basic|*) $command "$@" &>/dev/null & @@ -310,7 +367,7 @@ execute_command_with_progress() { printf "\n" ;; esac - printf "\n" + printf "\n" } stop_che_server() { diff --git a/dockerfiles/che-server/Dockerfile b/dockerfiles/che-server/Dockerfile index 171e8b0dfe7..5129ec3a2d8 100644 --- a/dockerfiles/che-server/Dockerfile +++ b/dockerfiles/che-server/Dockerfile @@ -1,3 +1,11 @@ +# Copyright (c) 2012-2016 Codenvy, S.A., Red Hat, Inc +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Mario Loriedo # # To build it, run in the repository root: # `docker build -t codenvy/che-server -f $(pwd)/dockerfiles/che-server/Dockerfile .`