Setting up a custom OpenCPU server

The below installs your Github repo into the Docker container using a small Dockerfile.

In summary:

  1. Launch an OpenCPU instance
  2. Build a new OpenCPU image with your Github custom package
  3. Push the image to the Container Registry for safe-keeping
  4. Stop the default OpenCPU docker container and launch your own

Launch an OpenCPU Instance

library(googleComputeEngineR)

## start an opencpu template
vm <- gce_vm(name = "opencpu", template = "opencpu", predefined_type = "n1-standard-2")

## wait for opencpu image to load
gce_check_container(vm, "opencpu")

Build a new OpenCPU image

This Dockerfile is available via get_dockerfolder("opencpu-installgithub") and below. It installs an OpenCPU package from my prediction of user URLs for prefetching application.

FROM opencpu/base
MAINTAINER Mark Edmondson (r@sunholo.com)

# install any package dependencies
RUN apt-get update && apt-get install -y \
    nano \
    ## clean up
    && apt-get clean \ 
    && rm -rf /var/lib/apt/lists/ \ 
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
    
## Install your custom package from Github
RUN Rscript -e "devtools::install_github(c('MarkEdmondson1234/predictClickOpenCPU'))"

The Dockerfile is used to build the custom image below:

## build a docker image with your package installed
docker_build(vm, 
             dockerfolder = get_dockerfolder("opencpu-installgithub"),
             new_image = "opencpu-predictclick")

Push the image to the Container Registry

## push up to your private Google Container registry
gce_push_registry(vm, 
                  save_name = "opencpu-predictclick", 
                  image_name = "opencpu-predictclick")

Deploy

In this case we don’t start a new instance, just stop the running OpenCPU container and start our own. We need to stop the default container to free up the ports 80 and 8004 that are needed for OpenCPU to work.

## stop default opencpu container
docker_cmd(vm, "stop opencpu-server")

## run custom opencpu server
docker_run(vm, 
           image = "opencpu-predictclick", 
           name = "predictclick", 
           detach = TRUE, 
           docker_opts = "-p 80:80 -p 8004:8004")

Clean up when you are done to avoid charges.