omniscale / imposm3

Imposm imports OpenStreetMap data into PostGIS
http://imposm.org/docs/imposm3/latest/
Apache License 2.0
710 stars 156 forks source link

Dockerfile example #265

Closed ssipos90 closed 2 years ago

ssipos90 commented 3 years ago

Hi,

I wanted to drop a Dockerfile, maybe someone will find it useful. This container needs OSM_CHANGES_URL to work and a planet dump either in dumps volume as /dumps/latest.pbf or specified as an env var.

build/osmimposm/Dockerfile:

FROM debian:buster-slim
ARG IMPOSM_VERSION=v0.11.1/imposm-0.11.1-linux-x86-64.tar.gz

RUN set -eu; \
    useradd -M -u 999 -r imposm; \
    mkdir -p /data /opt/imposm; \
    chown -R imposm:imposm /data /opt/imposm; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      curl \
      gettext; \
    curl -sL https://github.com/omniscale/imposm3/releases/download/$IMPOSM_VERSION \
    | tar -xz -C /usr/local/bin --strip-components=1; \
    chmod +x /usr/local/bin/imposm; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*; 

COPY import-pbf entrypoint /usr/local/bin/
COPY *.json* /opt/imposm/

VOLUME /data
VOLUME /expiry
VOLUME /dumps
WORKDIR /data
USER imposm
ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["run"]

build/osmimposm/entrypoint (chmod +x)

#!/bin/sh
set -eu

envsubst < /opt/imposm/config.json.template > /opt/imposm/config.json

export DEFAULT_ARGS="-config /opt/imposm/config.json -connection $DATABASE_URL"

case "$1" in
  import) import-pbf;;
  run)
    find /expiry -type f -mtime +3 -delete
    find /expiry -mindepth 1 -type d -mtime +7 -empty -delete
    exec imposm run $DEFAULT_ARGS
  ;;
  *) exec "$@";;
esac

build/osmimposm/config.json.template

{
  "replication_url": "$OSM_CHANGES_URL",
  "diffdir": "/data/diff",
  "cachedir": "/data/cache",
  "mapping": "/opt/imposm/mapping.json",
  "expiretiles_dir": "/expiry",
  "expiretiles_zoom": 14
}

build/osmimposm/import-pbf (chmod +x)

#!/bin/sh

set -eu

rm -rf /data/diff/* /data/cache/*

PBF_PATH=${PBF_PATH:-/dumps/latest.pbf}

imposm import $DEFAULT_ARGS \
                   -read "${PBF_PATH}" \
                   -diff \
                   -overwritecache \
                   -write

echo "deploying in production"
imposm import $DEFAULT_ARGS -deployproduction

docker-compose.yml

services:
  postgres:
    image: postgis/postgis
    ...
  osmimposm:
    build: build/osmimposm
    environment:
      - OSM_CHANGES_URL=https://planet.openstreetmap.org/replication/minute
      - DATABASE_URL=postgis://user:password@postgres/yourdbname
    volumes:
      - osmimposm:/data
      - osmtilesexpiry:/expiry
      - osmpbfdumps:/dumps:ro

volumes:
  osmimposm:
  osmpbfdumps:
  osmtilesexpiry:

You need to have a mapping.json in the build context.

Edits: Add missing volume, typos Add missing config.json.template Add docker-compose.yml

trytuna commented 2 years ago

Would be nice if there is an official docker image that can be used on different processor architectures (x86, x64 and arm64). What is your opinion about this?

ssipos90 commented 2 years ago

Would be nice if there is an official docker image that can be used on different processor architectures (x86, x64 and arm64). What is your opinion about this?

You'd probably need a build stage.