Deploy with Docker
This notebook explores how to build, export and deploy an application package.
See pyvespa, jupyter notebooks and Docker requirements to run this notebook.
Deploy an application package created with pyvespa
This section creates an empty ApplicationPackage instance for deployment testing:
[ ]:
from vespa.package import ApplicationPackage
app_package = ApplicationPackage(name="sampleapp")
Deploy the app_package
using Docker without leaving the notebook, by creating an instance of VespaDocker:
[ ]:
import os
from vespa.deployment import VespaDocker
vespa_docker = VespaDocker()
app = vespa_docker.deploy(application_package=app_package)
Waiting for configuration server, 0/300 seconds...
Waiting for configuration server, 5/300 seconds...
Waiting for application status, 0/300 seconds...
Waiting for application status, 5/300 seconds...
Waiting for application status, 10/300 seconds...
Waiting for application status, 15/300 seconds...
Waiting for application status, 20/300 seconds...
Waiting for application status, 25/300 seconds...
Finished deployment.
app
now holds a Vespa instance, to be used to interact with the application. Congratulations, the Vespa application is up and running!
Stop the docker container to clean up:
[ ]:
vespa_docker.container.stop()
vespa_docker.container.remove()
Learn Vespa by looking at underlying config files
pyvespa
provides a convenient API to define Vespa application packages from python. Going through those files is a nice way to start learning about Vespa syntax.
Use to_files to export the application package package created with pyvespa
from code to files:
[ ]:
from pathlib import Path
Path("mydir").mkdir(parents=True, exist_ok=True)
app_package.to_files("mydir")
Inspect the exported files:
[ ]:
!find mydir
It is also possible to export the application package as a zipped file using to_zipfile. The zipfile can later be deployed with pyvespa or the Vespa CLI:
[ ]:
app_package.to_zipfile("myzip.zip")
Remove the files after use:
[ ]:
from shutil import rmtree
rmtree("mydir", ignore_errors=True)
rmtree("myzip.zip", ignore_errors=True)
Deploy application package from config files
The pyvespa
API provides a subset of the functionality available in Vespa. The reason is that pyvespa
is meant to be used as an experimentation tool for Information Retrieval (IR) and not for building production-ready applications. So, the python API expands based on the needs to replicate common use cases that often require IR experimentation.
If the application requires functionality or fine-tuning not available in pyvespa
, simply build it directly using Vespa configuration files as shown in many examples on Vespa docs. But even in this case, one can still get value out of pyvespa
by deploying it from python based on the Vespa configuration files stored on disk.
Clone and deploy the news search app covered in this Vespa tutorial:
[ ]:
!git clone --depth 1 https://github.com/vespa-engine/sample-apps.git sample-apps
Cloning into 'sample-apps'...
remote: Enumerating objects: 1138, done.
remote: Counting objects: 100% (1138/1138), done.
remote: Compressing objects: 100% (754/754), done.
remote: Total 1138 (delta 189), reused 889 (delta 109), pack-reused 0
Receiving objects: 100% (1138/1138), 18.94 MiB | 9.38 MiB/s, done.
Resolving deltas: 100% (189/189), done.
The Vespa configuration files of the news search app are stored in sample-apps/news/app-3-searching/
:
[ ]:
!tree sample-apps/news/app-3-searching/
sample-apps/news/app-3-searching/
├── schemas
│ └── news.sd
└── services.xml
1 directory, 2 files
Deploy to a Docker container from disk:
[ ]:
import os
from vespa.deployment import VespaDocker
vespa_docker_news = VespaDocker()
app = vespa_docker_news.deploy_from_disk(
application_name="news",
application_root="sample-apps/news/app-3-searching")
Waiting for configuration server.
Waiting for configuration server.
Waiting for application status.
Waiting for application status.
Finished deployment.
app
can now be used to feed and query the application just deployed. Clean up after use:
[ ]:
vespa_docker_news.container.stop()
vespa_docker_news.container.remove()
rmtree("sample-apps", ignore_errors=True)