You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@submarine.apache.org by li...@apache.org on 2020/09/26 06:39:36 UTC

[submarine] branch master updated: SUBMARINE-617. Update the apache/notebook:jupyter-notebook docker image

This is an automated email from the ASF dual-hosted git repository.

liuxun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git


The following commit(s) were added to refs/heads/master by this push:
     new b47e43f  SUBMARINE-617. Update the apache/notebook:jupyter-notebook docker image
b47e43f is described below

commit b47e43fec1209d8dc5f273798d0484a26e55b7d7
Author: Ryan Lo <lo...@gmail.com>
AuthorDate: Fri Sep 25 15:01:46 2020 +0800

    SUBMARINE-617. Update the apache/notebook:jupyter-notebook docker image
    
    ### What is this PR for?
    1. Update the apache/notebook:jupyter-notebook docker image
    2. Preinstall notebook & apache-submarine in jupyter notebook
    3. Set two environment variable (SUBMARINE_SERVER_DNS_NAME & SUBMARINE_SERVER_PORT) in notebook container for ease of internal communication between submarine-server and notebook.
    
    ### What type of PR is it?
    [Improvement]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    [SUBMARINE-617](https://issues.apache.org/jira/projects/SUBMARINE/issues/SUBMARINE-617)
    
    ### How should this be tested?
    [Travis CI](https://travis-ci.org/github/lowc1012/submarine/builds/729093692)
    
    ### Screenshots (if appropriate)
    ![img1](https://user-images.githubusercontent.com/52355146/93810812-c1c33d00-fc81-11ea-96ac-bb83eb0e44aa.png)
    
    ![img2](https://user-images.githubusercontent.com/52355146/93810900-e0c1cf00-fc81-11ea-9bc6-4129bc75ac63.png)
    
    <img width="1212" alt="img3" src="https://user-images.githubusercontent.com/52355146/93810914-e8817380-fc81-11ea-9791-4588e5edc069.png">
    
    <img width="608" alt="img4" src="https://user-images.githubusercontent.com/52355146/93810953-f931e980-fc81-11ea-8c74-2dcc382b891b.png">
    
    ![img5](https://user-images.githubusercontent.com/52355146/94119704-d9691400-fe81-11ea-8e56-38d90553a4f3.png)
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Ryan Lo <lo...@gmail.com>
    Author: Ryan Lo <52...@users.noreply.github.com>
    
    Closes #407 from lowc1012/SUBMARINE-617 and squashes the following commits:
    
    9fdeb9b [Ryan Lo] Merge branch 'master' into SUBMARINE-617
    da0894e [Ryan Lo] SUBMARINE-617. insert default notebook environment
    2a29670 [Ryan Lo] SUBMARINE-618. Inject submarine-server dns name & port
    bb2fe03 [Ryan Lo] SUBMARINE-618. Install apache-submarine, notebook package in dockerfile
    59dec71 [Ryan Lo] SUBMARINE-617. Update the apache/notebook:jupyter-notebook docker image
---
 dev-support/docker-images/jupyter/Dockerfile       | 47 +++++++++---------
 .../docker-images/jupyter/start-notebook.sh        |  5 +-
 docs/database/submarine-data.sql                   |  4 +-
 .../submarine/templates/submarine-server.yaml      |  6 ++-
 .../submarine/experiment/api/experiment_client.py  | 14 +++++-
 .../submitter/k8s/parser/NotebookSpecParser.java   | 55 +++++++++++++---------
 6 files changed, 77 insertions(+), 54 deletions(-)

diff --git a/dev-support/docker-images/jupyter/Dockerfile b/dev-support/docker-images/jupyter/Dockerfile
index f513a6d..39267d9 100644
--- a/dev-support/docker-images/jupyter/Dockerfile
+++ b/dev-support/docker-images/jupyter/Dockerfile
@@ -21,14 +21,8 @@ ARG NB_PREFIX="/"
 ARG NB_PORT=8888
 
 USER root
-ENV NB_USER $NB_USER
-ENV NB_UID $NB_UID
-ENV NB_GID $NB_GID
-ENV NB_PREFIX $NB_PREFIX
-ENV NB_PORT $NB_PORT
-ENV CONDA_DIR=/opt/conda
-ENV PATH=$CONDA_DIR/bin:$PATH
-ENV HOME=/home/$NB_USER
+
+SHELL ["/bin/bash", "-c"]
 
 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
     apt-transport-https \
@@ -50,15 +44,25 @@ RUN echo "$LOG_TAG Set locale" && \
     echo "LANG=en_US.UTF-8" > /etc/locale.conf && \
     locale-gen en_US.UTF-8
 
-ENV LANG=en_US.UTF-8 \
-    LC_ALL=en_US.UTF-8
+ENV NB_USER=$NB_USER \
+    NB_UID=$NB_UID \
+    NB_PREFIX=$NB_PREFIX \
+    NB_PORT=$NB_PORT \
+    CONDA_DIR=/opt/conda \
+    LANG=en_US.UTF-8 \
+    LC_ALL=en_US.UTF-8 \
+    LANGUAGE=en_US.UTF-8
+ENV PATH=$CONDA_DIR/bin:$PATH \
+    HOME=/home/$NB_USER
 
 # Create NB_USER user with UID=1000 and in the 'users' group
-RUN useradd -m -s /bin/bash -N -u $NB_UID $NB_USER && \
+RUN useradd -M -s /bin/bash -N -u $NB_UID $NB_USER && \
     chown -R ${NB_USER}:users /usr/local/bin && \
     mkdir -p $HOME && \
-    chown -R ${NB_USER}:users ${HOME}
-
+    chown -R ${NB_USER}:users ${HOME} && \
+    mkdir -p ${CONDA_DIR} && \
+    chown -R ${NB_USER}:users ${CONDA_DIR} && \
+    chmod g+w /etc/passwd
 
 # Add Tini
 ENV TINI_VERSION v0.19.0
@@ -66,6 +70,7 @@ ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
 RUN mv /tini /usr/local/bin/tini && chmod +x /usr/local/bin/tini
 
 # Install conda
+USER $NB_UID
 ARG PYTHON_VERSION=default
 ENV MINICONDA_VERSION=4.8.3 \
     MINICONDA_MD5=751786b92c00b1aeae3f017b781018df \
@@ -83,22 +88,14 @@ RUN wget --quiet https://repo.continuum.io/miniconda/Miniconda3-py37_${MINICONDA
     conda config --system --set channel_priority strict && \
     if [ ! $PYTHON_VERSION = 'default' ]; then conda install --yes python=$PYTHON_VERSION; fi && \
     conda list python | grep '^python ' | tr -s ' ' | cut -d '.' -f 1,2 | sed 's/$/.*/' >> $CONDA_DIR/conda-meta/pinned && \
-    conda install --quiet --yes conda && \
-    conda install --quiet --yes pip && \
     conda clean --all -f -y && \
     rm -rf /home/$NB_USER/.cache/yarn
 
-# Install jupyter
-RUN conda install --quiet --yes notebook=6.0.3 && \
-    conda clean --all -f -y
-
-USER root
-RUN mkdir -p $CONDA_DIR && \
-    chown -R ${NB_USER}:users $CONDA_DIR
+# Install sumbarine python sdk and notebook
+RUN pip --quiet --no-cache-dir install notebook==6.1.3 apache-submarine
 
-USER $NB_USER
 EXPOSE $NB_PORT
 ENTRYPOINT ["tini", "-g", "--"]
-WORKDIR ${HOME}
 CMD ["start-notebook.sh"]
-COPY start-notebook.sh /usr/local/bin
+COPY --chown=${NB_USER}:users start-notebook.sh /usr/local/bin
+WORKDIR ${HOME}
diff --git a/dev-support/docker-images/jupyter/start-notebook.sh b/dev-support/docker-images/jupyter/start-notebook.sh
index 62962fe..fce5e33 100755
--- a/dev-support/docker-images/jupyter/start-notebook.sh
+++ b/dev-support/docker-images/jupyter/start-notebook.sh
@@ -21,8 +21,9 @@
 
 set -euo pipefail
 
-if [[ -n "${ENVIRONMENT_COMMAND:-}" ]]; then
-  /bin/bash -c "${ENVIRONMENT_COMMAND}"
+# Install conda dependency
+if [[ -n "${INSTALL_ENVIRONMENT_COMMAND:-}" ]]; then
+  /bin/bash -c "${INSTALL_ENVIRONMENT_COMMAND}"
 fi
 
 NOTEBOOK_ARGS="--ip=0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*'"
diff --git a/docs/database/submarine-data.sql b/docs/database/submarine-data.sql
index 4b47437..6bdcc0e 100644
--- a/docs/database/submarine-data.sql
+++ b/docs/database/submarine-data.sql
@@ -84,7 +84,9 @@ INSERT INTO `params` (`id`, `key`, `value`, `worker_index`) VALUES
 -- ----------------------------
 -- Records of environment
 -- ----------------------------
-INSERT INTO `environment` VALUES ('environment_1595134205164_0002', 'my-submarine-test-env','{"name":"my-submarine-test-env","dockerImage":"continuumio/anaconda3","kernelSpec":{"name":"team_default_python_3.7","channels":["defaults"],"dependencies":["_ipyw_jlab_nb_ext_conf=0.1.0=py37_0","alabaster=0.7.12=py37_0","anaconda=2020.02=py37_0","anaconda-client=1.7.2=py37_0","anaconda-navigator=1.9.12=py37_0"]}}','admin', '2020-05-06 14:00:05', 'Jack', '2020-05-06 14:00:14');
+INSERT INTO `environment` VALUES
+('environment_1600862964725_0001', 'notebook-env', '{"name":"notebook-env","dockerImage":"apache/submarine:jupyter-notebook-0.5.0-SNAPSHOT","kernelSpec":{"name":"submarine_jupyter_py3","channels":["defaults"],"dependencies":[]}}', 'admin', '2020-09-21 14:00:05', 'admin', '2020-09-21 14:00:14'),
+('environment_1595134205164_0002', 'my-submarine-test-env','{"name":"my-submarine-env","dockerImage":"continuumio/anaconda3","kernelSpec":{"name":"team_default_python_3.7","channels":["defaults"],"dependencies":["_ipyw_jlab_nb_ext_conf=0.1.0=py37_0","alabaster=0.7.12=py37_0","anaconda=2020.02=py37_0","anaconda-client=1.7.2=py37_0","anaconda-navigator=1.9.12=py37_0"]}}','admin', '2020-05-06 14:00:05', 'Jack', '2020-05-06 14:00:14');
 
 -- ----------------------------
 -- Records of experiment_templates
diff --git a/helm-charts/submarine/templates/submarine-server.yaml b/helm-charts/submarine/templates/submarine-server.yaml
index 2b22e3a..03dada2 100644
--- a/helm-charts/submarine/templates/submarine-server.yaml
+++ b/helm-charts/submarine/templates/submarine-server.yaml
@@ -57,13 +57,15 @@ spec:
           value: "8080"
         - name: SUBMARINE_SERVER_PORT_8080_TCP
           value: "8080"
+        - name: SUBMARINE_SERVER_DNS_NAME
+          value: "{{ .Values.submarine.server.name }}.{{ .Release.Namespace }}"
         - name: K8S_APISERVER_URL
           value: "kubernetes.default.svc"
-          
+
         image: "{{ .Values.submarine.server.image }}"
         imagePullPolicy: {{ .Values.submarine.server.imagePullPolicy }}
         command: ["/bin/bash", "-c"]
         args: ["/opt/submarine-current/bin/submarine.sh start getMysqlJar"]
         ports:
         - containerPort: 8080
-        
+
diff --git a/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_client.py b/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_client.py
index 00adc1d..50b909d 100644
--- a/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_client.py
+++ b/submarine-sdk/pysubmarine/submarine/experiment/api/experiment_client.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 
 import logging
+import os
 import time
 
 from submarine.experiment.configuration import Configuration
@@ -25,8 +26,19 @@ logging.basicConfig(format='%(message)s')
 logging.getLogger().setLevel(logging.INFO)
 
 
+def generate_host():
+    """
+    Generate submarine host
+    :return: submarine host
+    """
+    submarine_server_dns_name = str(os.environ.get("SUBMARINE_SERVER_DNS_NAME"))
+    submarine_server_port = str(os.environ.get("SUBMARINE_SERVER_PORT"))
+    host = submarine_server_dns_name + ':' + submarine_server_port
+    return host
+
+
 class ExperimentClient:
-    def __init__(self, host):
+    def __init__(self, host=generate_host()):
         """
         Submarine experiment client constructor
         :param host: An HTTP URI like http://submarine-server:8080.
diff --git a/submarine-server/server-submitter/submitter-k8s/src/main/java/org/apache/submarine/server/submitter/k8s/parser/NotebookSpecParser.java b/submarine-server/server-submitter/submitter-k8s/src/main/java/org/apache/submarine/server/submitter/k8s/parser/NotebookSpecParser.java
index 9cd7d31..e0889b4 100644
--- a/submarine-server/server-submitter/submitter-k8s/src/main/java/org/apache/submarine/server/submitter/k8s/parser/NotebookSpecParser.java
+++ b/submarine-server/server-submitter/submitter-k8s/src/main/java/org/apache/submarine/server/submitter/k8s/parser/NotebookSpecParser.java
@@ -30,6 +30,7 @@ import io.kubernetes.client.models.V1ResourceRequirements;
 import org.apache.submarine.commons.utils.SubmarineConfVars;
 import org.apache.submarine.commons.utils.SubmarineConfiguration;
 import org.apache.submarine.server.api.environment.Environment;
+import org.apache.submarine.server.api.spec.EnvironmentSpec;
 import org.apache.submarine.server.api.spec.KernelSpec;
 import org.apache.submarine.server.api.spec.NotebookPodSpec;
 import org.apache.submarine.server.api.spec.NotebookSpec;
@@ -82,38 +83,46 @@ public class NotebookSpecParser {
       container.setEnv(parseEnvVars(notebookPodSpec));
     }
 
+    // Add submarine server DNS name and port into notebook pod
+    V1EnvVar submarineServerDNSEnv = new V1EnvVar();
+    submarineServerDNSEnv.setName("SUBMARINE_SERVER_DNS_NAME");
+    submarineServerDNSEnv.setValue(System.getenv("SUBMARINE_SERVER_DNS_NAME"));
+    container.addEnvItem(submarineServerDNSEnv);
+
+    V1EnvVar submarineServerPortEnv = new V1EnvVar();
+    submarineServerPortEnv.setName("SUBMARINE_SERVER_PORT");
+    submarineServerPortEnv.setValue(System.getenv("SUBMARINE_SERVER_PORT"));
+    container.addEnvItem(submarineServerPortEnv);
+
     // Environment
     if (getEnvironment(notebookSpec) != null) {
-      String baseImage = getEnvironment(notebookSpec).getEnvironmentSpec().getDockerImage();
-      KernelSpec kernel = getEnvironment(notebookSpec).getEnvironmentSpec().getKernelSpec();
+      EnvironmentSpec environmentSpec = getEnvironment(notebookSpec).getEnvironmentSpec();
+      String baseImage = environmentSpec.getDockerImage();
+      KernelSpec kernel = environmentSpec.getKernelSpec();
       container.setImage(baseImage);
-      if (kernel.getDependencies().size() > 0) {
-        String condaVersionValidationCommand = generateCondaVersionValidateCommand();
-        StringBuffer createCommand = new StringBuffer();
-        String condaEnvironmentName = kernel.getName();
 
-        createCommand.append("conda create -q -y -n " + condaEnvironmentName);
+      String condaVersionValidationCommand = generateCondaVersionValidateCommand();
+      StringBuffer installCommand = new StringBuffer();
+      installCommand.append(condaVersionValidationCommand);
+
+      // If dependencies isn't empty
+      if (kernel.getDependencies().size() > 0) {
+        installCommand.append(" && conda install -y");
         for (String channel : kernel.getChannels()) {
-          createCommand.append(" ");
-          createCommand.append("-c");
-          createCommand.append(" ");
-          createCommand.append(channel);
+          installCommand.append(" ");
+          installCommand.append("-c");
+          installCommand.append(" ");
+          installCommand.append(channel);
         }
         for (String dependency : kernel.getDependencies()) {
-          createCommand.append(" ");
-          createCommand.append(dependency);
+          installCommand.append(" ");
+          installCommand.append(dependency);
         }
-
-        String activateEnvCommand = "source activate " + condaEnvironmentName;
-        String pathCommand = "PATH=/opt/conda/envs/env/bin:$PATH";
-        String finalCommand = condaVersionValidationCommand +
-                " && " + createCommand.toString() + " && "
-                + activateEnvCommand + " && " + pathCommand;
-        V1EnvVar envCommand = new V1EnvVar();
-        envCommand.setName("ENVIRONMENT_COMMAND");
-        envCommand.setValue(finalCommand);
-        container.addEnvItem(envCommand);
       }
+      V1EnvVar installCommandEnv = new V1EnvVar();
+      installCommandEnv.setName("INSTALL_ENVIRONMENT_COMMAND");
+      installCommandEnv.setValue(installCommand.toString());
+      container.addEnvItem(installCommandEnv);
     }
 
     // Resources


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@submarine.apache.org
For additional commands, e-mail: dev-help@submarine.apache.org