Docker image that builds and hosts a Gatsby site
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.editorconfig Initial Dockerfiles Nov 25, 2016
.gitignore Initial commit Jul 4, 2015
.travis.yml Build the onbuild tag based on the image built before Jan 6, 2018
Dockerfile Expose port 80 Jan 6, 2018
Dockerfile.onbuild Fix boot Feb 15, 2017
LICENSE Initial commit Jul 4, 2015 docs: Clarify build steps (#22) Nov 20, 2018 Add config for optional server rules (#15) Apr 19, 2018

Travis CI Build Status


Docker image that builds hosts a Gatsby site

This image has two major tags:

  • latest - will serve your assets on production using up an nginx server

  • onbuild - builds your project and creates a new docker image


  1. Build your project's public assets with gatsby build
  2. Create a Dockerfile, as below, at the root of your project:
    FROM gatsbyjs/gatsby:onbuild
  3. Build your project's docker image:
    docker build -t myproject/website .
  4. Upload to the registry
    docker push myproject/website
  5. Use it
    docker run --rm -p 80:80 myproject/website
    # Open your browser at http://localhost


The way Nginx behaves can be configured using environment variables.

Please refer the docker run command options for the --env-file flag where you can specify all required environment variables in a single file. This will save you from writing a potentially long docker run command. Alternatively you can use docker-compose.

Below is the complete list of available options that can be used to customize your Nginx configuration:

Environment variable Default Description
CHARSET utf-8 Charset being used in Content-Type response header field. See
WORKER_CONNECTIONS 1024 The maximum number of simultaneous connections that can be opened by a worker process. See
HTTP_PORT 80 The address and / or port for IP, or the path for a UNIX-domain socket on which the server will accept requests. See
PUBLIC_PATH /pub The path to the directory from which files are being served. See
GZIP_TYPES application/javascript application/x-javascript application/rss+xml text/javascript text/css image/svg+xml MIME types in addition to text/html for which gzip compression should be enabled. See
GZIP_LEVEL 6 Gzip compression level of a response. See
CACHE_IGNORE html Regular expression to specify which paths shouldn't be cachable (header Cache-Control set to no-store).
CACHE_PUBLIC ico|jpg|jpeg|png|gif|svg|js|jsx|css|less|swf|eot|ttf|otf|woff|woff2 Regular expression to specify which paths should be cachable (headers Cache-Control set to public and Expires set to the value of $CACHE_PUBLIC_EXPIRATION).
CACHE_PUBLIC_EXPIRATION 1y Time to set for header Expires. See
TRAILING_SLASH true Specifies if paths should end with a trailing slash or not. Prevents duplicated content by redirecting requests to URLs ending with a slash to its non-trailing-slash equivalent if set to true and the other way around for false.
CUSTOM_SERVER_CONFIG Need to add some advanced/custom nginx config? No problem, you can inject through this environment variable. NOTE: would be discarded if /etc/nginx/server.conf is present.
DEBUG false If set to true the configuration is being printed before the server starts.

Append rules for the server block in nginx config

You can mount a file to /etc/nginx/server.conf to extend the server block in nginx config. This could be useful if you have defined client only routes in GatsbyJS. For example for client only rules on path /client-only the content of your mounted file should be like:

rewrite ^/client-only/([^.]*?/)$ /client-only/index.html;

Alternatively you can use a custom Dockerfile and copy the file on build:

FROM gatsbyjs/gatsby:latest
COPY nginx-server-rules.conf /etc/nginx/server.conf

NOTE: By adding the file /etc/nginx/server.conf, all the contents of the CUSTOM_SERVER_CONFIG environment variable will be discarded.