Skip to content

Commit

Permalink
Issue #22: Create a Docker image.
Browse files Browse the repository at this point in the history
* After much debugging, it seems xvfb (virtual frame buffer) needed to be
  implemented to get opengl working properly.
* Switched to using our own from-stratch Dockerfile based on Ubuntu 14.04
* Switched to x11vnc instead of tightvnc since tightvnc didn't seem to work,
  but not sure if that's still an issue or not.
* Added lots of documentation around the various settings used.
* Using fluxbox instead of lxdm because it was lighter weight.
  • Loading branch information
Frank Carey committed Feb 9, 2017
1 parent 82dd0d7 commit f25f642
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 34 deletions.
33 changes: 33 additions & 0 deletions .docker/startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/bash

# Remove VNC lock (if process already killed)
rm -f /tmp/.X1-lock /tmp/.X11-unix/X1

# Set the DISPLAY that will be used by default. Makes lab show up in our xvfb display
export DISPLAY=:1

# Start the X virtual frame buffer which uses memory instead of an actual device.
# Allows lab to be run headless.
Xvfb "$DISPLAY" -screen 0 "$XVFB_RESOLUTION" &

# Run a lightweight Window Manager (fluxbox is smaller than lxdm, gnome, unity, kde, etc)
# (pretty sure this is required.)
fluxbox &

# Run the x11vnc server
# Explanation of options:
# -display : This needs to match the xvfb display number
# -passwd : Use the password from an ENV var here instead of using ~/.vnc/passwd
# -o : Specifies where to send the log output.
# -noipv6 : Skip trying to serve vnc on ipv6 (avoids warnings)
# -bg : Run in the background
# -forever : Don't die when the first user disconnects from vnc (which is the default)
# -N : Makes it use port 5900+N where N is the display.. so 5901. (default is 5900)
x11vnc \
-display "$DISPLAY" \
-passwd "$VNC_PASSWORD" \
-o /dev/stderr \
-noipv6 \
-bg \
-forever \
-N
81 changes: 53 additions & 28 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
FROM kaixhin/vnc
FROM ubuntu:14.04

MAINTAINER [email protected]

# Temporarily shut up warnings.
ENV DISPLAY :0
ENV TERM xterm

# Basic Dependencies
RUN apt-get update && apt-get install -y \
curl \
zip \
unzip \
software-properties-common \
python-software-properties && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# Dependencies for vnc setup.
RUN apt-get update && apt-get install -y \
xvfb \
fluxbox \
x11vnc && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*


# We need to add a custom PPA to pick up JDK8, since trusty doesn't
# have an openjdk8 backport. openjdk-r is maintained by a reliable contributor:
Expand All @@ -18,13 +32,14 @@ RUN apt-get update && apt-get install -y \
# finally backported to trusty; see e.g.
# https://bugs.launchpad.net/trusty-backports/+bug/1368094
RUN add-apt-repository -y ppa:openjdk-r/ppa && \
apt-get update && \
apt-get install -y openjdk-8-jdk openjdk-8-jre-headless && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
which java && \
java -version && \
update-ca-certificates -f
apt-get update && apt-get install -y \
openjdk-8-jdk \
openjdk-8-jre-headless && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
which java && \
java -version && \
update-ca-certificates -f

# Running bazel inside a `docker build` command causes trouble, cf:
# https://github.com/bazelbuild/bazel/issues/134
Expand All @@ -48,34 +63,44 @@ RUN mkdir /bazel && \

# Install deepmind-lab dependencies
RUN apt-get update && apt-get install -y \
lua5.1 \
liblua5.1-0-dev \
libffi-dev \
gettext \
freeglut3-dev \
libsdl2-dev \
libosmesa6-dev \
python-dev \
python-numpy \
realpath \
build-essential
lua5.1 \
liblua5.1-0-dev \
libffi-dev \
gettext \
freeglut3-dev \
libsdl2-dev \
libosmesa6-dev \
python-dev \
python-numpy \
realpath \
build-essential && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

#Enable RANDR option for vnc server.
COPY ./vnc.sh /opt/vnc.sh

# Set the default X11 Display.
ENV DISPLAY :1
ENV VNC_PASSWORD=password
ENV XVFB_RESOLUTION=800x600x16

# Set up deepmind-lab folder and copy in the code.
ENV lab_dir /lab
RUN mkdir /$lab_dir
COPY . /$lab_dir
WORKDIR $lab_dir

RUN bazel build :deepmind_lab.so --define headless=osmesa

# RUN bazel run :python_module_test --define headless=osmesa

#RUN bazel run :random_agent --define headless=false
# Run an actual (headless) build since this should make subsequent builds much faster.
# Alternative commands based on the Documentation:
# RUN bazel run :random_agent --define headless=false
# RUN bazel build :deepmind_lab.so --define headless=osmesa
RUN bazel run :python_module_test --define headless=osmesa

# This port is the default for connecting to VNC display :1
EXPOSE 5901

# Copy VNC script that handles restarts and make it executable.
COPY ./.docker/startup.sh /opt/
RUN chmod u+x /opt/startup.sh

# Finally, start VNC using our script.
CMD ["/opt/startup.sh"]
6 changes: 0 additions & 6 deletions vnc.sh

This file was deleted.

0 comments on commit f25f642

Please sign in to comment.