
This should get us most of the way there to support using monitor during a spack container build, for both Singularity and Docker. Some quick notes: ### Docker Docker works by way of BUILDKIT and being able to specify --secret. What this means is that you can prefix a line with a mount of type secret as follows: ```bash # Install the software, remove unnecessary deps RUN --mount=type=secret,id=su --mount=type=secret,id=st cd /opt/spack-environment && spack env activate . && export SPACKMON_USER=$(cat /run/secrets/su) && export SPACKMON_TOKEN=$(cat /run/secrets/st) && spack install --monitor --fail-fast && spack gc -y ``` Where the id for one or more secrets corresponds to the file mounted at `/run/secrets/<name>`. So, for example, to build this container with su (spackmon user) and sv (spackmon token) defined I would export them on my host and do: ```bash $ DOCKER_BUILDKIT=1 docker build --network="host" --secret id=st,env=SPACKMON_TOKEN --secret id=su,env=SPACKMON_USER -t spack/container . ``` And when we add `env` to the secret definition that tells the build to look for the secret with id "st" in the environment variable `SPACKMON_TOKEN` for example. If the user is building locally with a local spack monitor, we also need to set the `--network` to be the host, otherwise you can't connect to it (a la isolation of course.) ## Singularity Singularity doesn't have as nice an ability to clearly specify secrets, so (hoping this eventually gets implemented) what I'm doing now is providing the user instructions to write the credentials to a file, add it to the container to source, and remove when done. ## Tags Note that the tags PR https://github.com/spack/spack/pull/23712 will need to be merged before `--monitor-tags` will actually work because I'm checking for the attribute (that doesn't exist yet): ```bash "tags": getattr(args, "monitor_tags", None) ``` So when that PR is merged to update the argument group, it will work here, and I can either update the PR here to not check if the attribute is there (it will be) or open another one in the case this PR is already merged. Finally, I added a bunch of documetation for how to use monitor with containerize. I say "mostly working" because I can't do a full test run with this new version until the container base is built with the updated spack (the request to the monitor server for an env install was missing so I had to add it here). Signed-off-by: vsoch <vsoch@users.noreply.github.com> Co-authored-by: vsoch <vsoch@users.noreply.github.com>
266 lines
8.0 KiB
ReStructuredText
266 lines
8.0 KiB
ReStructuredText
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
|
Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
|
|
SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
.. _monitoring:
|
|
|
|
==========
|
|
Monitoring
|
|
==========
|
|
|
|
You can use a `spack monitor <https://github.com/spack/spack-monitor>`_ "Spackmon"
|
|
server to store a database of your packages, builds, and associated metadata
|
|
for provenance, research, or some other kind of development. You should
|
|
follow the instructions in the `spack monitor documentation <https://spack-monitor.readthedocs.org>`_
|
|
to first create a server along with a username and token for yourself.
|
|
You can then use this guide to interact with the server.
|
|
|
|
-------------------
|
|
Analysis Monitoring
|
|
-------------------
|
|
|
|
To read about how to monitor an analysis (meaning you want to send analysis results
|
|
to a server) see :ref:`analyze_monitoring`.
|
|
|
|
---------------------
|
|
Monitoring An Install
|
|
---------------------
|
|
|
|
Since an install is typically when you build packages, we logically want
|
|
to tell spack to monitor during this step. Let's start with an example
|
|
where we want to monitor the install of hdf5. Unless you have disabled authentication
|
|
for the server, we first want to export our spack monitor token and username to the environment:
|
|
|
|
.. code-block:: console
|
|
|
|
$ export SPACKMON_TOKEN=50445263afd8f67e59bd79bff597836ee6c05438
|
|
$ export SPACKMON_USER=spacky
|
|
|
|
|
|
By default, the host for your server is expected to be at ``http://127.0.0.1``
|
|
with a prefix of ``ms1``, and if this is the case, you can simply add the
|
|
``--monitor`` flag to the install command:
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack install --monitor hdf5
|
|
|
|
|
|
If you need to customize the host or the prefix, you can do that as well:
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack install --monitor --monitor-prefix monitor --monitor-host https://monitor-service.io hdf5
|
|
|
|
|
|
As a precaution, we cut out early in the spack client if you have not provided
|
|
authentication credentials. For example, if you run the command above without
|
|
exporting your username or token, you'll see:
|
|
|
|
.. code-block:: console
|
|
|
|
==> Error: You are required to export SPACKMON_TOKEN and SPACKMON_USER
|
|
|
|
This extra check is to ensure that we don't start any builds,
|
|
and then discover that you forgot to export your token. However, if
|
|
your monitoring server has authentication disabled, you can tell this to
|
|
the client to skip this step:
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack install --monitor --monitor-disable-auth hdf5
|
|
|
|
If the service is not running, you'll cleanly exit early - the install will
|
|
not continue if you've asked it to monitor and there is no service.
|
|
For example, here is what you'll see if the monitoring service is not running:
|
|
|
|
.. code-block:: console
|
|
|
|
[Errno 111] Connection refused
|
|
|
|
|
|
If you want to continue builds (and stop monitoring) you can set the ``--monitor-keep-going``
|
|
flag.
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack install --monitor --monitor-keep-going hdf5
|
|
|
|
This could mean that if a request fails, you only have partial or no data
|
|
added to your monitoring database. This setting will not be applied to the
|
|
first request to check if the server is running, but to subsequent requests.
|
|
If you don't have a monitor server running and you want to build, simply
|
|
don't provide the ``--monitor`` flag! Finally, if you want to provide one or
|
|
more tags to your build, you can do:
|
|
|
|
.. code-block:: console
|
|
|
|
# Add one tag, "pizza"
|
|
$ spack install --monitor --monitor-tags pizza hdf5
|
|
|
|
# Add two tags, "pizza" and "pasta"
|
|
$ spack install --monitor --monitor-tags pizza,pasta hdf5
|
|
|
|
|
|
----------------------------
|
|
Monitoring with Containerize
|
|
----------------------------
|
|
|
|
The same argument group is available to add to a containerize command.
|
|
|
|
^^^^^^
|
|
Docker
|
|
^^^^^^
|
|
|
|
To add monitoring to a Docker container recipe generation using the defaults,
|
|
and assuming a monitor server running on localhost, you would
|
|
start with a spack.yaml in your present working directory:
|
|
|
|
.. code-block:: yaml
|
|
|
|
spack:
|
|
specs:
|
|
- samtools
|
|
|
|
And then do:
|
|
|
|
.. code-block:: console
|
|
|
|
# preview first
|
|
spack containerize --monitor
|
|
|
|
# and then write to a Dockerfile
|
|
spack containerize --monitor > Dockerfile
|
|
|
|
|
|
The install command will be edited to include commands for enabling monitoring.
|
|
However, getting secrets into the container for your monitor server is something
|
|
that should be done carefully. Specifically you should:
|
|
|
|
- Never try to define secrets as ENV, ARG, or using ``--build-arg``
|
|
- Do not try to get the secret into the container via a "temporary" file that you remove (it in fact will still exist in a layer)
|
|
|
|
Instead, it's recommended to use buildkit `as explained here <https://pythonspeed.com/articles/docker-build-secrets/>`_.
|
|
You'll need to again export environment variables for your spack monitor server:
|
|
|
|
.. code-block:: console
|
|
|
|
$ export SPACKMON_TOKEN=50445263afd8f67e59bd79bff597836ee6c05438
|
|
$ export SPACKMON_USER=spacky
|
|
|
|
And then use buildkit along with your build and identifying the name of the secret:
|
|
|
|
.. code-block:: console
|
|
|
|
$ DOCKER_BUILDKIT=1 docker build --secret id=st,env=SPACKMON_TOKEN --secret id=su,env=SPACKMON_USER -t spack/container .
|
|
|
|
The secrets are expected to come from your environment, and then will be temporarily mounted and available
|
|
at ``/run/secrets/<name>``. If you forget to supply them (and authentication is required) the build
|
|
will fail. If you need to build on your host (and interact with a spack monitor at localhost) you'll
|
|
need to tell Docker to use the host network:
|
|
|
|
.. code-block:: console
|
|
|
|
$ DOCKER_BUILDKIT=1 docker build --network="host" --secret id=st,env=SPACKMON_TOKEN --secret id=su,env=SPACKMON_USER -t spack/container .
|
|
|
|
|
|
^^^^^^^^^^^
|
|
Singularity
|
|
^^^^^^^^^^^
|
|
|
|
To add monitoring to a Singularity container build, the spack.yaml needs to
|
|
be modified slightly to specify wanting a different format:
|
|
|
|
|
|
.. code-block:: yaml
|
|
|
|
spack:
|
|
specs:
|
|
- samtools
|
|
container:
|
|
format: singularity
|
|
|
|
|
|
Again, generate the recipe:
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
# preview first
|
|
$ spack containerize --monitor
|
|
|
|
# then write to a Singularity recipe
|
|
$ spack containerize --monitor > Singularity
|
|
|
|
|
|
Singularity doesn't have a direct way to define secrets at build time, so we have
|
|
to do a bit of a manual command to add a file, source secrets in it, and remove it.
|
|
Since Singularity doesn't have layers like Docker, deleting a file will truly
|
|
remove it from the container and history. So let's say we have this file,
|
|
``secrets.sh``:
|
|
|
|
.. code-block:: console
|
|
|
|
# secrets.sh
|
|
export SPACKMON_USER=spack
|
|
export SPACKMON_TOKEN=50445263afd8f67e59bd79bff597836ee6c05438
|
|
|
|
|
|
We would then generate the Singularity recipe, and add a files section,
|
|
a source of that file at the start of ``%post``, and **importantly**
|
|
a removal of the final at the end of that same section.
|
|
|
|
.. code-block::
|
|
|
|
Bootstrap: docker
|
|
From: spack/ubuntu-bionic:latest
|
|
Stage: build
|
|
|
|
%files
|
|
secrets.sh /opt/secrets.sh
|
|
|
|
%post
|
|
. /opt/secrets.sh
|
|
|
|
# spack install commands are here
|
|
...
|
|
|
|
# Don't forget to remove here!
|
|
rm /opt/secrets.sh
|
|
|
|
|
|
You can then build the container as your normally would.
|
|
|
|
.. code-block:: console
|
|
|
|
$ sudo singularity build container.sif Singularity
|
|
|
|
|
|
------------------
|
|
Monitoring Offline
|
|
------------------
|
|
|
|
In the case that you want to save monitor results to your filesystem
|
|
and then upload them later (perhaps you are in an environment where you don't
|
|
have credentials or it isn't safe to use them) you can use the ``--monitor-save-local``
|
|
flag.
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack install --monitor --monitor-save-local hdf5
|
|
|
|
This will save results in a subfolder, "monitor" in your designated spack
|
|
reports folder, which defaults to ``$HOME/.spack/reports/monitor``. When
|
|
you are ready to upload them to a spack monitor server:
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
$ spack monitor upload ~/.spack/reports/monitor
|
|
|
|
|
|
You can choose the root directory of results as shown above, or a specific
|
|
subdirectory. The command accepts other arguments to specify configuration
|
|
for the monitor.
|