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