Merge pull request #363 from jhamman/feature/launch_script

Add launch script
pull/375/head
Tim Head 2018-08-15 16:55:17 +02:00 zatwierdzone przez GitHub
commit 12b8f1df03
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
8 zmienionych plików z 68 dodań i 1 usunięć

Wyświetl plik

@ -121,6 +121,20 @@ An example usecase of ``postBuild`` file is JupyterLab's demo on mybinder.org.
It uses a ``postBuild`` file in a folder called ``binder`` to `prepare
their demo for binder <https://github.com/jupyterlab/jupyterlab-demo/blob/master/binder/postBuild>`_.
.. _start:
``start``
^^^^^^^^^
A script that can contain arbitrary commands to be run at runtime (as an
`ENTRYPOINT <https://docs.docker.com/engine/reference/builder/#entrypoint>`
to the docker container). If you want this to be a shell script, make sure the
first line is ```#!/bin/bash``. The last line must be ```exec "$@"```
equivalent.
.. TODO: Discuss runtime limits, best practices, etc.
Also, point to an example.
.. _runtime.txt:
``runtime.txt``

Wyświetl plik

@ -23,4 +23,4 @@ Note that this doesn't apply to adding additional libraries / UI to existing
buildpacks. For example, if we had an R buildpack and it supported IRKernel,
it is much easier to
just support RStudio / Shiny with it, since those are library additions than entirely
new buildpacks.
new buildpacks.

Wyświetl plik

@ -131,6 +131,12 @@ RUN ./{{ s }}
{% endfor %}
{% endif -%}
# Add start script
{% if start_script -%}
RUN chmod +x "{{ start_script }}"
ENTRYPOINT ["{{ start_script }}"]
{% endif -%}
# Specify the default command to run
CMD ["jupyter", "notebook", "--ip", "0.0.0.0"]
@ -333,6 +339,21 @@ class BuildPack:
"""
return []
def get_start_script(self):
"""
An ordered list of executable scripts to be executated at runtime.
These scripts are added as an `ENTRYPOINT` to the container.
Is run as a non-root user, and must be executable. Used for doing
things that are currently not supported by other means and need to be
applied at runtime (set environment variables).
The scripts should be as deterministic as possible - running it twice
should not produce different results.
"""
return ''
def binder_path(self, path):
"""Locate a file"""
if os.path.exists('binder'):
@ -380,6 +401,7 @@ class BuildPack:
build_script_files=self.get_build_script_files(),
base_packages=sorted(self.get_base_packages()),
post_build_scripts=self.get_post_build_scripts(),
start_script=self.get_start_script(),
appendix=self.appendix,
)
@ -519,3 +541,9 @@ class BaseImage(BuildPack):
if os.path.exists(post_build):
return [post_build]
return []
def get_start_script(self):
start = self.binder_path('start')
if os.path.exists(start):
return start
return ''

Wyświetl plik

@ -0,0 +1,8 @@
System - Post-build scripts
---------------------------
It is possible to run scripts after you've built the environment specified in
your other files. This could be used to, for example, download data or run
some configuration scripts.
In this example, we download and install a Jupyter Notebook extension.

Wyświetl plik

@ -0,0 +1,2 @@
#!/bin/bash
jupyter nbextension enable --py --sys-prefix ipyleaflet

Wyświetl plik

@ -0,0 +1 @@
ipyleaflet

Wyświetl plik

@ -0,0 +1,5 @@
#!/bin/bash
export TEST_START_VAR="var is set"
exec "$@"

Wyświetl plik

@ -0,0 +1,9 @@
#!/bin/bash
set -euo pipefail
jupyter nbextension list | grep 'jupyter-leaflet' | grep enabled
if [ "$TEST_START_VAR" != "var is set" ]
then
echo "TEST_START_VAR is not set"
exit 1
fi