Docker-only installation
It is possible to develop with dallinger using only docker as a prerequisite.
This means you do not need to follow most of the steps detailed in the Installation instructions.
Instead, you just need to install Docker, and create a .dallingerconfig
file containing
the information requested in the Installation instructions.
Once these steps are complete, you can move forward following these instructions:
Set up services
Create the dallinger docker network (if not present already):
docker network create dallinger
Start services needed by dallinger:
docker run -d --name dallinger_redis --network=dallinger -v dallinger_redis:/data redis redis-server --appendonly yes
docker run -d --name dallinger_postgres --network=dallinger -e POSTGRES_USER=dallinger -e POSTGRES_PASSWORD=dallinger -e POSTGRES_DB=dallinger -v dallinger_postgres:/var/lib/postgresql/data postgres:12
If you have these already created you can remove the existing ones and recreate them. To remove the existing ones run:
# Needed if you want to recreate containers
docker rm dallinger_redis
docker rm dallinger_postgres
or you can start the containers you have:
# Needed if you want to start stopped containers
docker start dallinger_redis dallinger_postgres
Start adminer:
docker run -d -p 8080:8080 --name dallinger_adminer --network dallinger --link dallinger_postgres:db adminer
Connect to adminer by visiting http://localhost:8080 Select PostgreSQL from the dropdown, and enter dallinger as both username and password. You can leave the “database” field blank to get a list of existing databases.
Run experiment from docker image
Enter the experiment directory:
cd /path/to/experiment-directory
Create a file named Dockerfile with these contents (replace image name in the FROM directive to match the dallinger version you depend on in your constraints.txt file):
# syntax = docker/dockerfile:1.2
FROM ghcr.io/dallinger/dallinger
RUN mkdir /experiment
COPY requirements.txt /experiment/requirements.txt
COPY constraints.txt /experiment/constraints.txt
WORKDIR /experiment
# Some experiments might only list dallinger as dependency
# If they do the grep command will exit non-0, the pip command will not run
# but the whole `RUN` group will succeed thanks to the last `true` invocation.
# We remove dallinger from the dependencies since it's already present in the base image
# and pip-installing it again might result in wasted time and space while pip
# looks for all its dependencies and potentially reinstalls already present packages.
RUN (grep -v ^dallinger requirements.txt > /tmp/requirements_no_dallinger.txt && \
python3 -m pip install -r /tmp/requirements_no_dallinger.txt -c constraints.txt && \
rm -rf /root/.cache) || true
COPY . /experiment
ENV PORT=5000
CMD dallinger_heroku_web
Build a docker image for the experiment using Buildkit:
EXPERIMENT_IMAGE=my-experiment
DOCKER_BUILDKIT=1 docker build . -t ${EXPERIMENT_IMAGE}
Create an alias to start the development server with docker and run it:
alias dallinger-dev-server='docker run --name dallinger --rm -ti -u $(id -u ${USER}):$(id -g ${USER}) -v ${PWD}:/experiment --network dallinger -p 5000:5000 -e FLASK_OPTIONS='-h 0.0.0.0' -e REDIS_URL=redis://dallinger_redis:6379 -e DATABASE_URL=postgresql://dallinger:dallinger@dallinger_postgres/dallinger ${EXPERIMENT_IMAGE} dallinger develop debug'
dallinger-dev-server
You can now access the running dallinger instance on http://localhost:5000/dashboard The admin password can be found in the develop config.txt file:
grep dashboard_password ./develop/config.txt
Deploy the experiment image using ssh
We’re going to use variations of the same command, so we create an alias for convenience.
# On Linux you can use:
alias docker-dallinger='docker run --rm -ti -v /etc/group:/etc/group -v ~/.docker:/root/.docker -v ~/.local/share/dallinger/:/root/.local/share/dallinger/ -e HOME=/root -e DALLINGER_NO_EGG_BUILD=1 -v /var/run/docker.sock:/var/run/docker.sock -v $(readlink -f $SSH_AUTH_SOCK):/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ${PWD}:/experiment ${EXPERIMENT_IMAGE} dallinger'
# On Mac Os you can use:
alias docker-dallinger='docker run --rm -ti -v /etc/group:/etc/group -v ~/.docker:/root/.docker -v ~/.local/share/dallinger/:/root/.local/share/dallinger/ -e HOME=/root -e DALLINGER_NO_EGG_BUILD=1 -v /var/run/docker.sock:/var/run/docker.sock -v ~/.ssh:/root/.ssh -v ${PWD}:/experiment ${EXPERIMENT_IMAGE} dallinger'
Then we can use the alias to run dallinger inside a container:
docker-dallinger docker-ssh servers list
Create a remote server with
docker-dallinger docker-ssh servers add --host <your-server-name-or-ip>
And deploy to it with
docker-dallinger docker-ssh deploy