First, follow the Docker installation instructions to setup your Docker environment and create the project Docker containers.
We use docker-compose
to run an Elasticsearch container, a PostgreSQL container,
and Django in a Python container.
There is also a container serving the documentation.
All of these containers are configured in our
docker-compose.yml file.
See the Docker documentation
for more about the format and use of this file.
The following URLs are mapped to your host from the containers:
- Access consumerfinance.gov running in the Python container: http://localhost:8000/
- Access Elasticsearch: http://localhost:9200/
- View this documentation: http://localhost:8888/
To build and run the containers for the first time, run:
docker network create cfgov
docker-compose upEnvironment variables from your .env file are sourced
when the Python container starts
and when you access the running Python container.
Your local shell environment variables, however,
are not visible to applications running in Docker.
To add new environment variables, simply add them to the .env file,
stop docker-compose with Ctrl+C,
and start it again with docker-compose up.
Django manage.py commands can only be run after you've
opened up a shell in the Python container.
From there, commands like cfgov/manage.py migrate should run as expected.
The same goes for scripts like ./refresh-data.sh and ./initial-data.sh —
they will work as expected once you’re inside the Python container.
- Python:
docker-compose exec python bash - Elasticsearch:
docker-compose exec elasticsearch bash - PostgreSQL:
docker-compose exec postgres bash
If the Python package requirements files have changed,
you will need to stop docker-compose (if it is running)
and rebuild the Python container using:
docker-compose up --build pythonSee “Using Docker” on the Related Projects page.
If you have inserted a PDB breakpoint in your code
and need to interact with the running Django process when the breakpoint is reached
you can run docker attach:
docker attach consumerfinance.gov_python_1When you're done, you can detach with Ctrl+P Ctrl+Q.
For docker-compose commands,
[SERVICE] is the service name that is defined in docker-compose.yml.
For docker commands, [CONTAINER] is the container name displayed with docker ps.
docker pswill list all containers.docker logs [CONTAINER]will print the logs of a container.docker top [CONTAINER]will display the running processes in a container.docker-compose build [SERVICE]will build any of our configured containers.
This repository includes a "production-like" Docker image, created for experimenting with how cf.gov could be built and run as a Docker container in production.
This includes:
- all relevant
consumerfinance.govsource code - all OS, Python, and JS dependencies for building and running the cf.gov webapp
- procedures for executing Django
collectstaticandyarn-based frontend build process - an Apache HTTPD webserver with
mod_wsgi, run with configs inconsumerfinance.gov
If you just want to build the image:
docker build . --build-arg scl_python_version=rh-python36 -t your-desired-image-nameNote: The scl_python_version build arg specifies which
Python Software Collection
version you'd like to use. We've tested this against rh-python36.
You can also launch the full cf.gov stack locally via docker-compose. This setup is
a nice way to test out new Apache config changes. It includes volumes that mount your
local checkout cfgov/apache config directories into the container, allowing you to
change configs locally without having to rebuild the image each time.
-
Launch the stack.
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --build
This creates a container running cf.gov on Python, as well as Postgres and Elasticsearch containers, much like the development environment.
-
Load the
cfgovdatabase (optional). If you do not already have a runningcfgovdatabase, you will need to download and load it from within the container.docker-compose exec python bash # Once in the container... export CFGOV_PROD_DB_LOCATION=<database-dump-url> ./refresh-data.sh
-
Browse to your new local cf.gov site.
-
Adjust an Apache
cfgov/apacheconfig and reload Apache (optional).docker-compose exec python bash # Once in the container... httpd -d ./cfgov/apache -k restart
-
Switch back to the development Compose setup.
docker-compose rm -sf python docker-compose up --build python
This repo also includes a Docker Swarm-compatible Compose file
(docker-stack.yml).
This file is intended for use with the project's Jenkinsfile
multibranch build pipeline.
It follows a standard Docker build/scan/push workflow,
optionally deploying to our Docker Swarm cluster.
The production image extends the development image. If you look at the Dockerfile, this is spelled out by the line:
FROM cfgov-dev as cfgov-prod
Both 'cfgov-dev' and 'cfgov-prod' are called "build stages". That line means, "create a new stage, starting from cfgov-dev, called cfgov-prod".
From there, we:
- Install SCL-based Apache HTTPD, and the
mod_wsgiversion appropriate for our chosenscl_python_version. - Run frontend.sh, Django's collectstatic command, and then uninstall node and yarn.
- Set the default command on container startup to
httpd -d ./cfgov/apache -D FOREGROUND, which runs Apache using the configuration in consumerfinance.gov, in the foreground (typical when running Apache in a container).