-
Notifications
You must be signed in to change notification settings - Fork 912
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable the app to be built using Docker #1290
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
* | ||
!Gemfile | ||
!Gemfile.lock | ||
!db/functions | ||
!db/docker_postgres.sh | ||
!lib/quad_tile |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# Using Docker to run OpenStreetMap | ||
|
||
Using [Docker](https://www.docker.com/) will allow you to install the OpenStreetMap application and all its' dependencies in a container, almost with a single command. | ||
|
||
These instructions gloss over the precise details of the dependencies and their configuration but these can be found in full detail at [INSTALL.md](INSTALL.md). | ||
|
||
The first step is to fork/clone the repo to your local machine. Then run these commands: | ||
|
||
### App configuration | ||
|
||
``` | ||
cp config/example.application.yml config/application.yml | ||
``` | ||
|
||
### Database | ||
|
||
``` | ||
cp config/example.database.yml config/database.yml | ||
``` | ||
|
||
Set `username` to postgres and `host` to db leave the password blank | ||
|
||
### Installation | ||
|
||
In the root directory run: | ||
|
||
``` | ||
docker-compose up | ||
``` | ||
|
||
### Migrations | ||
|
||
``` | ||
docker-compose exec web bundle exec rake db:migrate | ||
``` | ||
|
||
Once these are complete you should be able to visit the app at http://localhost:3000 | ||
|
||
If localhost does not work, you can use the IP address of the docker-machine. | ||
|
||
### Tests | ||
|
||
``` | ||
docker-compose exec web bundle exec rake test:db | ||
``` | ||
|
||
### Bash | ||
|
||
If you want to get onto the web container and run specific commands you can fire up bash via: | ||
|
||
``` | ||
docker-compose exec web /bin/bash | ||
``` | ||
|
||
Similarly, if you want to get onto the db container use: | ||
|
||
``` | ||
docker-compose exec db /bin/bash | ||
``` | ||
|
||
### General Information | ||
|
||
The [docker-compose.yml](docker-compose.yml) specifies the configuration for the two web and db containers. For example port that the Postgres database is exposed on that you can point your local db admin tool at. | ||
|
||
Note that the [Dockerfile.postgres](Dockerfile.postgres) for the db container includes various build tools to run [db/docker_postgres.sh](db/docker_postgres.sh). This script installs extensions and functions required by the database and it is run automatically because it is specifically added to the location `docker-entrypoint-initdb.d` on the container. | ||
|
||
There is a [.dockerignore](.dockerignore) that ignores all files except those required to be added to the containers. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
FROM ruby:2.3-slim | ||
MAINTAINER OpenStreetMap | ||
ENV REFRESHED_AT 2016-09-15 | ||
|
||
# Install packages | ||
RUN apt-get update | ||
RUN apt-get install -y --no-install-recommends build-essential | ||
RUN apt-get install -y --no-install-recommends ruby-dev | ||
RUN apt-get install -y --no-install-recommends libxml2-dev | ||
RUN apt-get install -y --no-install-recommends libxslt1-dev | ||
RUN apt-get install -y --no-install-recommends libpq-dev | ||
RUN apt-get install -y --no-install-recommends libsasl2-dev | ||
RUN apt-get install -y --no-install-recommends imagemagick | ||
RUN apt-get install -y --no-install-recommends libmagickwand-dev | ||
RUN apt-get install -y --no-install-recommends nodejs | ||
RUN apt-get install -y --no-install-recommends file | ||
RUN apt-get install -y --no-install-recommends postgresql-client | ||
RUN apt-get install -y --no-install-recommends locales | ||
RUN apt-get clean && rm -rf /var/lib/apt/lists/* | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Standard practice is to have all the apt-get stuff on one line |
||
|
||
# Setup app location | ||
RUN mkdir -p /app | ||
WORKDIR /app | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also consider creating/running as an unprivileged user. |
||
|
||
# Install gems | ||
ADD Gemfile /app/Gemfile | ||
ADD Gemfile.lock /app/Gemfile.lock | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're adding There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These are required so that bundler can install all the gem dependencies required for the app. They have to be manually added so that they are available during the image build process. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The added benefit is that gems will only be reinstalled when |
||
RUN bundle install | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In other images I've seen a CMD set so you get a meaningful console when you access it, e.g. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That I think something like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Including There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (Commenting here because it's the end of the file.)
(This can co-exist happily with mapping There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also consider adding |
||
|
||
RUN sed -i -e 's/# en_GB.UTF-8 UTF-8/en_GB.UTF-8 UTF-8/' /etc/locale.gen && \ | ||
echo 'LANG="en_GB.UTF-8"'>/etc/default/locale && \ | ||
dpkg-reconfigure --frontend=noninteractive locales && \ | ||
update-locale LANG=en_GB.UTF-8 | ||
|
||
ENV LANG en_GB.UTF-8 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (For those new to Docker, each Docker "command" creates a filesystem layer. Filesystem layers are (typically) cached, allowing changes to later parts of the process to skip installation steps that were already taken care of (that were also defined earlier in the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (Changes to files |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
FROM postgres:9.4 | ||
|
||
ADD db/docker_postgres.sh docker-entrypoint-initdb.d/docker_postgres.sh | ||
ADD db/functions/ db/functions/ | ||
ADD lib/quad_tile/ lib/quad_tile/ | ||
|
||
RUN apt-get update | ||
RUN apt-get install -y make \ | ||
postgresql-server-dev-all \ | ||
build-essential \ | ||
&& apt-get clean && rm -rf /var/lib/apt/lists/* |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#!/bin/bash | ||
set -e | ||
psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "CREATE EXTENSION btree_gist" openstreetmap | ||
make -C db/functions libpgosm.so | ||
psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "CREATE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '/db/functions/libpgosm', 'maptile_for_point' LANGUAGE C STRICT" openstreetmap | ||
psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "CREATE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '/db/functions/libpgosm', 'tile_for_point' LANGUAGE C STRICT" openstreetmap | ||
psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "CREATE FUNCTION xid_to_int4(xid) RETURNS int4 AS '/db/functions/libpgosm', 'xid_to_int4' LANGUAGE C STRICT" openstreetmap |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
version: '2' | ||
services: | ||
web: | ||
image: openstreetmap-website:v1 | ||
build: | ||
context: . | ||
dockerfile: Dockerfile | ||
volumes: | ||
- .:/app | ||
ports: | ||
- "3000:3000" | ||
command: bundle exec rails s -p 3000 -b '0.0.0.0' | ||
depends_on: | ||
- db | ||
db: | ||
image: openstreetmap-db:v1 | ||
build: | ||
context: . | ||
dockerfile: Dockerfile.postgres | ||
ports: | ||
- "5432:5432" | ||
environment: | ||
POSTGRES_DB: openstreetmap |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can this be automated, since we always know what the DB info is when running in docker?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guides I've read keep this kind of configuration separate. I would suggest leaving it out for now and it could be reviewed later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All of the configuration variables can be set using the environment:
OSM_...
Defaults could be set in the
Dockerfile
and overwritten with-e
or--env-file
or using equivalentdocker-compose.yml
configuration.