Docker¶
Merlin has a simple Dockerfile description for running a container with all requirements installed.
Build the container¶
The docker container can be built by building in the top level merlin directory.
docker build -t merlin .
This will create a merlin:latest image in your docker image collection with a user “merlinu” and a WORKDIR set to /home/merlinu.
docker images
Run the container¶
The container can be run in detached mode to provide both the merlin
and celery
commands
docker run --rm -td --name my-merlin merlin
alias merlin="docker exec my-merlin merlin"
alias celery="docker exec my-merlin celery"
Examples can be run through docker containers by first starting a server for the broker and backend. The server can be a redis or rabbitmq , for this demonstration a redis server will be used. The backend will always be a redis server.
docker pull redis
docker run -d -p 6379:6379 --name my-redis redis
A local output directory can be defined
by using the --volume
docker arguments. It is
recommended that a fixed directory be used for the --volume
argument.
The merlin docker container is linked to the redis server above by using
the --link
option.
# Create local working directory
mkdir $HOME/merlinu
cd $HOME/merlinu
docker pull llnl/merlin
docker run --rm -td --name my-merlin --link my-redis --volume "$HOME/merlinu":/home/merlinu llnl/merlin
alias merlin="docker exec my-merlin merlin"
alias celery="docker exec my-merlin celery"
# Create the $HOME/merlinu/.merlin/app.yaml using redis
merlin config --broker redis
<edit $HOME/merlinu/.merlin/app.yaml and change the broker and backend server: variables to my-redis>
# Copy an example to the local dir
merlin example feature_demo
# Run a test run without workers
merlin run feature_demo/feature_demo.yaml --dry --local
# Define the tasks and load them on the broker
merlin run feature_demo/feature_demo.yaml
# Start workers to pull tasks from the server and run them in the container
merlin run-workers feature_demo/feature_demo.yaml
A shell can started in the container by using the
--entrypoint
command. If the user would like to examine the container
contents, they can use a shell as the entry point.
docker run --rm -ti --volume "$HOME/merlinu":/home/merlinu --entrypoint="/bin/bash" merlin