Newer
Older
glx-docker-headless-gpu / Dockerfile
@kbkn kbkn on 3 Apr 2021 9 KB bug fix
FROM ubuntu:18.04
#FROM nvidia/opengl:1.2-glvnd-runtime-ubuntu18.04 
#FROM nvidia/vulkan:1.1.121-cuda-10.1--ubuntu18.04

LABEL maintainer="ikko@hosei.ac.jp"

RUN sed -i 's#http://archive.ubuntu.com/ubuntu/#mirror://mirrors.ubuntu.com/mirrors.txt#' /etc/apt/sources.list;

ARG CARLA_VERSION_FULL=0.9.10.1
ARG CARLA_VERSION=0.9.10
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,graphics,display
ENV DEBIAN_FRONTEND noninteractive

# add new sudo user
ENV USERNAME kbkn
ENV HOME /home/$USERNAME
RUN useradd -m $USERNAME && \
        echo "$USERNAME:$USERNAME" | chpasswd && \
        usermod --shell /bin/bash $USERNAME && \
        usermod -aG sudo $USERNAME && \
        mkdir /etc/sudoers.d && \
        echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$USERNAME && \
        chmod 0440 /etc/sudoers.d/$USERNAME && \
        # Replace 1000 with your user/group id
        usermod  --uid 1000 $USERNAME && \
        groupmod --gid 1000 $USERNAME && \
        mkdir -p /home/$USERNAME/.cache  && \
        mkdir -p /home/$USERNAME/.config && \
        mkdir -p /home/$USERNAME/.cache && \
        chown -Rf $USERNAME.$USERNAME /home/$USERNAME

RUN apt-get update && apt-get install -y --no-install-recommends \
        sudo \
        less \
        tmux \
        bash-completion \
        command-not-found \
        software-properties-common \
        xsel \
        xdg-user-dirs \
        python \
        python-pip \
        python-dev \
        python-protobuf \
        python-pexpect \
        pcl-tools \
        openssh-server \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN packages='libsdl2-2.0 xserver-xorg libvulkan1' \
	&& apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $packages --no-install-recommends \
    && VULKAN_API_VERSION=`dpkg -s libvulkan1 | grep -oP 'Version: [0-9|\.]+' | grep -oP '[0-9|\.]+'` && \
	mkdir -p /etc/vulkan/icd.d/ && \
	echo \
	"{\
		\"file_format_version\" : \"1.0.0\",\
		\"ICD\": {\
			\"library_path\": \"libGLX_nvidia.so.0\",\
			\"api_version\" : \"${VULKAN_API_VERSION}\"\
		}\
	}" > /etc/vulkan/icd.d/nvidia_icd.json \
	&& rm -rf /var/lib/apt/lists/*

# Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: Failed to execute child process dbus-launch (No such file or directory)
# fix by setting LANG https://askubuntu.com/questions/608330/problem-with-gnome-terminal-on-gnome-3-12-2
# to install locales https://stackoverflow.com/questions/39760663/docker-ubuntu-bin-sh-1-locale-gen-not-found

RUN apt-get clean && \
    apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

# (1) Install Xorg and NVIDIA driver inside the container
# Almost same procesure as nvidia/driver https://gitlab.com/nvidia/driver/blob/master/ubuntu16.04/Dockerfile

# (1-1) Install prerequisites
#RUN dpkg --add-architecture i386 && \
RUN  apt-get update && apt-get install -y --no-install-recommends \
        apt-utils \
        build-essential \
        ca-certificates \
        curl \
        wget \
        vim \
        zip \
        unzip \
        git \
        kmod \
        libc6 \
        pkg-config \
        libelf-dev && \
    rm -rf /var/lib/apt/lists/*

#        libc6:i386 \
# (1-2) Install xorg server and xinit BEFORE INSTALLING NVIDIA DRIVER.
# After this installation, command Xorg and xinit can be used in the container
# if you need full ubuntu desktop environment, the line below should be added.
        # ubuntu-desktop \
RUN apt-get update && apt-get install -y \
        xinit && \
    rm -rf /var/lib/apt/lists/*

COPY cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb /tmp/cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb
RUN cd /tmp && \
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin && \
    mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
    dpkg -i cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb && \
    apt-key add /var/cuda-repo-ubuntu1804-11-2-local/7fa2af80.pub && \
    apt-get update && apt-get install -y --no-install-recommends \
    cuda-drivers && \
    rm -rf cuda-repo-ubuntu1804-11-2-local_11.2.2-460.32.03-1_amd64.deb && \
    rm -rf /var/lib/apt/lists/*


# (2) Configurate Xorg
# (2-1) Install some necessary softwares
#
# pkg-config: nvidia-xconfig requires this package
# mesa-utils: This package includes glxgears and glxinfo, which is useful for testing GLX drivers
# x11vnc: Make connection between x11 server and VNC client.
# x11-apps: xeyes can be used to make sure that X11 server is running.
#
# Note: x11vnc in ubuntu18.04 is useless beacuse of stack smashing bug. See below to manual compilation.
RUN apt-get update && apt-get install -y --no-install-recommends \
        mesa-utils \
        x11-apps && \
    rm -rf /var/lib/apt/lists/*

# solution for the `stack smashing detected` issue
# https://github.com/LibVNC/x11vnc/issues/61
RUN apt-get update && apt-get install -y --no-install-recommends \
        automake autoconf libssl-dev xorg-dev libvncserver-dev xdg-user-dirs xdg-utils && \
    rm -rf /var/lib/apt/lists/* && \
    git clone -b 0.9.16 https://github.com/LibVNC/x11vnc.git && \
    cd x11vnc && \
    ./autogen.sh && \
    make && \
    cp src/x11vnc /usr/bin/x11vnc

# (2-2) Optional vulkan support
# vulkan-utils includes vulkan-smoketest, benchmark software of vulkan API
RUN apt-get update && apt-get install -y --no-install-recommends \
        vulkan-utils && \
    rm -rf /var/lib/apt/lists/*

# for test
RUN apt-get update && apt-get install -y --no-install-recommends \
        firefox openbox menu && \
    rm -rf /var/lib/apt/lists/*

# sound driver and GTK library
# If you want to use sounds on docker, try `pulseaudio --start`
RUN apt-get update && apt-get install -y --no-install-recommends \
      alsa pulseaudio libgtk2.0-0 && \
    rm -rf /var/lib/apt/lists/*

# novnc
# download websockify as well
RUN wget https://github.com/novnc/noVNC/archive/v1.2.0.zip && \
  unzip -q v1.2.0.zip && \
  rm -rf v1.2.0.zip && \
  git clone https://github.com/novnc/websockify /noVNC-1.2.0/utils/websockify

# Xorg segfault error
# dbus-core: error connecting to system bus: org.freedesktop.DBus.Error.FileNotFound (Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory)
# related? https://github.com/Microsoft/WSL/issues/2016
RUN apt-get update && apt-get install -y --no-install-recommends \
      dbus-x11 \
      libdbus-c++-1-0v5 && \
    rm -rf /var/lib/apt/lists/*

RUN echo "alias m='cd /home/$USERNAME ; su $USERNAME'" >> /home/$USERNAME/.bashrc 

# ROS Melodic
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-melodic-desktop-full \
        python-rosdep \
        python-rosinstall \
        python-rosinstall-generator \
        python-wstool \
        build-essential \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# addtional ROS package
RUN apt-get update && apt-get install -y --no-install-recommends \
        ros-melodic-derived-object-msgs \
        ros-melodic-ackermann-msgs \
        ros-melodic-ainstein-radar-msgs \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
RUN pip install --upgrade setuptools wheel && \
    pip install \
        simple-pid \
        numpy \
        pygame \
        transforms3d \
        future \
        matplotlib \
        open3d \
        pyrsistent==0.16.1 \
        psutil \
        py-cpuinfo \
        python-tr \
        xmlschema==1.0.18 \
        py-trees==0.8.3 \
        Shapely \
        mkdocs \
        markdown-include \
        mkdocs-redirects \
        networkx \
        decorator==5.0.0 && \
     rosdep init

USER $USERNAME
WORKDIR /home/$USERNAME
RUN rosdep update
COPY CARLA_${CARLA_VERSION_FULL}.tar.gz /home/$USERNAME/
RUN mkdir CARLA_${CARLA_VERSION_FULL} && \
    tar xfvz CARLA_${CARLA_VERSION_FULL}.tar.gz -C CARLA_${CARLA_VERSION_FULL} && \
    rm /home/$USERNAME/CARLA_${CARLA_VERSION_FULL}.tar.gz
COPY AdditionalMaps_${CARLA_VERSION_FULL}.tar.gz /home/$USERNAME/
RUN tar xfvz AdditionalMaps_${CARLA_VERSION_FULL}.tar.gz -C /home/$USERNAME/CARLA_${CARLA_VERSION_FULL}/ && \
    rm /home/$USERNAME/AdditionalMaps_${CARLA_VERSION_FULL}.tar.gz

RUN echo "export PYTHONPATH=$PYTHONPATH:~/CARLA_${CARLA_VERSION_FULL}/PythonAPI/carla/dist/carla-${CARLA_VERSION}-py2.7-linux-x86_64.egg:~/CARLA_${CARLA_VERSION_FULL}/PythonAPI/carla" >> ~/.bashrc

SHELL ["/bin/bash", "-c"]
RUN mkdir -p ~/catkin_ws/src && \
    source /opt/ros/melodic/setup.bash && \
    catkin_init_workspace ~/catkin_ws/src && \
    cd ~/catkin_ws/src && \
    git clone --recursive https://github.com/carla-simulator/ros-bridge.git -b ${CARLA_VERSION_FULL} && \
    cd ~/catkin_ws && \
    catkin_make -DCMAKE_BUILD_TYPE=Release && \
    source ~/catkin_ws/devel/setup.bash

RUN cd /home/$USERNAME && \
    git clone https://github.com/carla-simulator/scenario_runner.git -b v${CARLA_VERSION}

RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc && \
    echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc && \
    echo "alias cm='cd ~/catkin_ws;catkin_make'" >> ~/.bashrc && \
    echo "alias cs='cd ~/catkin_ws/src'" >> ~/.bashrc  && \
    echo "export SCENARIO_RUNNER_PATH=/home/$USERNAME/scenario_runner" >> ~/.bashrc

USER root
WORKDIR /root
RUN echo "alias m='cd /home/$USERNAME ; su $USERNAME'" >> /root/.bashrc


COPY startup.sh /startup.sh
COPY scripts/ /home/$USERNAME/scripts/
EXPOSE 5900
EXPOSE 8081 
CMD ["bash", "/startup.sh"]