From 7b0e79d45bc5c25686e924e392e1d28da6c526b3 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Sun, 18 Jan 2026 15:04:41 +0100 Subject: [PATCH] dockerfile: finally produce a working dockerfile --- scripts/docker/fail-base/Dockerfile | 152 ++++++++++++------ scripts/docker/fail-demo/Dockerfile | 80 ++++----- .../docker/fail-generic-tracing/Dockerfile | 53 +++--- 3 files changed, 172 insertions(+), 113 deletions(-) diff --git a/scripts/docker/fail-base/Dockerfile b/scripts/docker/fail-base/Dockerfile index 443b0fd5..24367fae 100644 --- a/scripts/docker/fail-base/Dockerfile +++ b/scripts/docker/fail-base/Dockerfile @@ -1,68 +1,122 @@ -# Set the base image to Ubuntu Xenial (16.04) -FROM ubuntu:xenial +# Set the base image to Ubuntu Jammy. Jammy includes the correct dependency versions except for LLVM. +FROM ubuntu:jammy -MAINTAINER Christian Dietrich +LABEL org.opencontainers.image.authors="Christian Dietrich " -# Install Packages required to build FAIL* -RUN apt-get update -RUN apt-get install -y \ - build-essential \ - libmysqlclient-dev \ - protobuf-compiler \ - libprotobuf-dev \ - libpcl1-dev \ - libboost-thread-dev \ - libboost-system-dev \ - libboost-regex-dev \ - libboost-coroutine-dev \ - libboost-context-dev \ - libdwarf-dev \ - libelf-dev \ - libfontconfig1-dev \ - zlib1g-dev \ - binutils-dev \ - libiberty-dev \ - llvm-3.9-dev \ - clang-3.9 \ - libsdl1.2-dev \ - libgtk2.0-dev \ - libwxgtk3.0-dev \ - libncurses5-dev \ +# TODO: Can shrink the image size down by a LOT: +# - A lot of dependencies are unnecessary, I just need to figure out which +# - Separate build-time / runtime dependencies, then do 2 stages +# - Combine multiple RUNs into a single one +# - Use apt-get --no-install-recommends during package install and apt-get clean afterwards - cmake \ - cmake-curses-gui \ - doxygen \ - git \ - screen \ - wget \ - openssh-server \ - vim \ +# Install basic packages +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \ + build-essential \ + ca-certificates \ + cmake \ + cmake-curses-gui \ + wget \ + git \ + doxygen \ + screen \ + openssh-server \ + neovim \ ranger -# Symlink clang++ to match docs -RUN ln -sf /usr/bin/clang++-3.9 /usr/bin/clang++ +# NOTE: Only required if the base image is not Jammy +# Install Boost 1.74 (focal includes 1.71) +# Jammy includes the correct version but its llvm is too old +# RUN wget https://archives.boost.io/release/1.74.0/source/boost_1_74_0.tar.gz \ +# && tar xvzf boost_1_74_0.tar.gz && cd boost_1_74_0 \ +# && chmod +x ./bootstrap.sh \ +# && ./bootstrap.sh --prefix=/usr/local \ +# && ./b2 && ./b2 install +# && cd / && rm -rf boost_1_74_0.tar.gz && rm -rf boost_1_74_0 +# ENV BOOST_ROOT=/usr/local + +# NOTE: Only required if the base image is not Focal +# Install LLVM 6.0 from source +RUN git clone https://github.com/llvm/llvm-project.git && cd llvm-project \ + && git checkout llvmorg-6.0.0 \ + && mkdir build && cd build \ + && cmake -G "Unix Makefiles" ../llvm \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_TERMINFO=OFF \ + -DLLVM_ENABLE_CURSES=OFF \ + -DLLVM_ENABLE_PROJECTS="clang;lld" \ + && make -j$(nproc) && make install \ + && cd / && rm -rf ./llvm-project + +# Install packages required to build FAIL* +RUN DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \ + # binutils-dev \ + libmysqlclient-dev \ + libprotobuf-dev \ + libtinfo-dev \ + libpcl1-dev \ + libdwarf-dev \ + libelf-dev \ + libiberty-dev \ + libboost-thread-dev \ + libboost-system-dev \ + libboost-regex-dev \ + libboost-coroutine-dev \ + libboost-context-dev \ + libfontconfig1-dev \ + zlib1g-dev \ + libz3-dev \ + libsdl1.2-dev \ + # libsdl2-dev \ + libgtk2.0-dev \ + # libgtk-3-dev \ + # libwxbase3.0-dev \ + libwxgtk3.0-gtk3-dev \ + libncurses-dev \ + # libncurses5-dev \ + libx11-dev \ + xorg-dev \ + libasound2-dev + +# Install packages required to run FAIL* +RUN DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \ + protobuf-compiler \ + libtinfo6 \ + # libtinfo5 \ + libmariadb3 \ + libprotobuf23 \ + libncurses6 \ + && apt-get clean + +# NOTE: Only required if we install llvm from apt +# Symlink clang++/llvm-config to match docs +# RUN ln -sf /usr/bin/clang++-6.0 /usr/bin/clang++ \ +# && ln -sf /usr/bin/llvm-config-6.0 /usr/bin/llvm-config # Add a user for compiling FAIL* -RUN useradd fail; mkdir /home/fail; chown fail /home/fail -RUN echo 'fail:fail' | chpasswd; chsh fail --shell /bin/bash -RUN adduser fail sudo +RUN useradd fail \ + && mkdir /home/fail && chown fail /home/fail \ + && echo 'fail:fail' | chpasswd && chsh fail --shell /bin/bash \ + && adduser fail sudo # SSH login fix. Otherwise user is kicked off after login -RUN mkdir /var/run/sshd -RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd +RUN mkdir /var/run/sshd \ + && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd -ENV NOTVISIBLE "in users profile" +ENV NOTVISIBLE="in users profile" RUN echo "export VISIBLE=now" >> /etc/profile USER fail -ENV HOME /home/fail +ENV HOME=/home/fail WORKDIR /home/fail # Get AspectC++ (originally v1.2) for 64 Bit -ARG acversion="2.0" -RUN wget http://www.aspectc.org/releases/"$acversion"/ac-bin-linux-x86-64bit-"$acversion".tar.gz -RUN tar xvzf ac-bin-linux-x86-64bit-"$acversion".tar.gz; mkdir bin; mv aspectc++/ac++ aspectc++/ag++ bin/; rm -rf aspectc++ -ENV PATH /home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ARG acversion="2.5" +RUN wget http://www.aspectc.org/releases/"$acversion"/ac-bin-linux-x86-64bit-"$acversion".tar.gz \ + && tar xvzf ac-bin-linux-x86-64bit-"$acversion".tar.gz \ + && mkdir bin && mv aspectc++/ac++ aspectc++/ag++ bin/ \ + && rm -rf aspectc++ && rm -rf ac-bin-linux-x86-64bit-"$acversion".tar.gz +ENV PATH=/home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Clone FAIL* RUN git clone https://github.com/danceos/fail.git diff --git a/scripts/docker/fail-demo/Dockerfile b/scripts/docker/fail-demo/Dockerfile index 4266d2ca..e5d14f5d 100644 --- a/scripts/docker/fail-demo/Dockerfile +++ b/scripts/docker/fail-demo/Dockerfile @@ -4,19 +4,8 @@ # place (~fail/bin/*) FROM danceos/fail-generic-tracing -MAINTAINER Christian Dietrich - -# Install Additional Packages -RUN apt-get install -y \ - python-minimal \ - grub-common \ - xorriso \ - grub-pc-bin \ - mysql-client \ - python-flask \ - python-mysqldb \ - python-yaml +LABEL org.opencontainers.image.authors="Christian Dietrich " # Passwort for MySQL Daemon ADD my.cnf /home/fail/.my.cnf @@ -24,8 +13,8 @@ RUN chown fail /home/fail/.my.cnf USER fail WORKDIR /home/fail -RUN echo 'export PATH=$HOME/bin:$PATH' >> ~/.profile;\ - echo 'cd $HOME/fail-targets' >> ~/.profile +RUN echo 'export PATH=$HOME/bin:$PATH' >> ~/.profile \ + && echo 'cd $HOME/fail-targets' >> ~/.profile RUN git clone https://github.com/danceos/fail-targets.git @@ -36,7 +25,7 @@ WORKDIR build RUN cmake \ -DAGXX=/home/fail/bin/ag++ \ -DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \ - + # Enable / Disable features \ -DBUILD_ARM=OFF \ -DBUILD_BOCHS=ON \ -DBUILD_CAPSTONE_DISASSEMBLER=OFF \ @@ -54,17 +43,16 @@ RUN cmake \ -DBUILD_QEMU=OFF \ -DBUILD_T32=OFF \ -DBUILD_X86=ON \ - + # \ -DCLIENT_JOB_INITIAL=1 \ -DCLIENT_JOB_LIMIT=1000 \ -DCLIENT_JOB_REQUEST_SEC=30 \ -DCLIENT_RAND_BACKOFF_TEND=8 \ -DCLIENT_RAND_BACKOFF_TSTART=3 \ -DCLIENT_RETRY_COUNT=3 \ - - # ;-separated list + # ;-separated list \ -DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \ - + # \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCONFIG_BOCHS_COMPRESS_STATE=ON \ @@ -89,18 +77,16 @@ RUN cmake \ -DCONFIG_SR_SAVE=ON \ -DCONFIG_SUPPRESS_INTERRUPTS=ON \ -DENABLE_DATABASE_TESTS=OFF \ - - # ;-separated list + # ;-separated list \ -DEXPERIMENTS_ACTIVATED="generic-experiment" \ - + # \ -DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \ -DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \ -DMYSQL_CONFIG=/usr/bin/mysql_config \ -DMYSQL_CONFIG_PREFER_PATH=/bin \ - - # ;-separated list + # ;-separated list \ -DPLUGINS_ACTIVATED="serialoutput" \ - + # \ -DSERVER_COMM_HOSTNAME=localhost \ -DSERVER_COMM_TCP_PORT=1111 \ -DSERVER_OUT_QUEUE_SIZE=0 \ @@ -114,26 +100,48 @@ RUN cmake \ -DTEST_MYSQL_USER=fail_test \ -DVERBOSE_MAKE=OFF \ -D_filename=/usr/include/wx-3.0/wx/version.h \ - - # ;-separated list + # ;-separated list \ -Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \ - + # \ -Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \ .. # We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step # (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly. -RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) +# RUN cmake --build . --target libfailbochs_external-configure \ +# && cmake --build . +RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) \ + && cmake --build . -- -j$(nproc) # Make FAIL* -RUN cmake --build . -- -j$(nproc) +RUN ln -s /home/fail/fail/build/bin/fail-client /home/fail/bin/generic-experiment-client \ + && ln -s /home/fail/fail/build/bin/generic-experiment-server /home/fail/bin/ \ + && ln -s /home/fail/fail/tools/analysis/resultbrowser/run.py /home/fail/bin/resultbrowser -# Make FAIL* -RUN ln -s /home/fail/fail/build/bin/fail-client /home/fail/bin/generic-experiment-client; \ - ln -s /home/fail/fail/build/bin/generic-experiment-server /home/fail/bin/; \ - ln -s /home/fail/fail/tools/analysis/resultbrowser/run.py /home/fail/bin/resultbrowser +USER root + +# Install additional packages +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \ + grub-common \ + xorriso \ + grub-pc-bin \ + mysql-client \ + python2-minimal \ + python2-dev \ + # python2-flask \ + # python2-mysqldb \ + # python2-yaml \ + unzip \ + && apt-get clean + +RUN ln -sf /usr/bin/python2 /usr/bin/python + +# Install python packages +RUN wget https://bootstrap.pypa.io/pip/2.7/get-pip.py \ + && python2 get-pip.py \ + && wget https://raw.githubusercontent.com/paulfitz/mysql-connector-c/master/include/my_config.h -O /usr/include/mysql/my_config.h \ + && pip2 install flask pyyaml MySQL-python # For the resultbrowser, we expose port 5000 to the outside world. EXPOSE 5000 - -USER root diff --git a/scripts/docker/fail-generic-tracing/Dockerfile b/scripts/docker/fail-generic-tracing/Dockerfile index 2e611b89..c4e83762 100644 --- a/scripts/docker/fail-generic-tracing/Dockerfile +++ b/scripts/docker/fail-generic-tracing/Dockerfile @@ -1,20 +1,21 @@ # Inherit from docker container that has the fail source code prepared, # including all tools which are needed to build FAIL* FROM danceos/fail-base -MAINTAINER Christian Dietrich + +LABEL org.opencontainers.image.authors="Christian Dietrich " USER fail # Configure the Weather Monitor Experiment -ENV PATH /home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +ENV PATH=/home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin WORKDIR /home/fail/fail -RUN mkdir build-tracer; cd build-tracer +RUN mkdir build-tracer && cd build-tracer WORKDIR build-tracer RUN cmake \ -DAGXX=/home/fail/bin/ag++ \ -DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \ - + # Enable / Disable features \ -DBUILD_ARM=OFF \ -DBUILD_BOCHS=ON \ -DBUILD_CAPSTONE_DISASSEMBLER=OFF \ @@ -32,17 +33,16 @@ RUN cmake \ -DBUILD_QEMU=OFF \ -DBUILD_T32=OFF \ -DBUILD_X86=ON \ - + # \ -DCLIENT_JOB_INITIAL=1 \ -DCLIENT_JOB_LIMIT=1000 \ -DCLIENT_JOB_REQUEST_SEC=30 \ -DCLIENT_RAND_BACKOFF_TEND=8 \ -DCLIENT_RAND_BACKOFF_TSTART=3 \ -DCLIENT_RETRY_COUNT=3 \ - - # ;-separated list + # ;-separated list \ -DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \ - + # \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCONFIG_BOCHS_COMPRESS_STATE=ON \ @@ -67,18 +67,16 @@ RUN cmake \ -DCONFIG_SR_SAVE=ON \ -DCONFIG_SUPPRESS_INTERRUPTS=ON \ -DENABLE_DATABASE_TESTS=OFF \ - - # ;-separated list + # ;-separated list \ -DEXPERIMENTS_ACTIVATED="generic-tracing" \ - + # \ -DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \ -DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \ -DMYSQL_CONFIG=/usr/bin/mysql_config \ -DMYSQL_CONFIG_PREFER_PATH=/bin \ - - # ;-separated list + # ;-separated list \ -DPLUGINS_ACTIVATED="tracing;serialoutput" \ - + # \ -DSERVER_COMM_HOSTNAME=localhost \ -DSERVER_COMM_TCP_PORT=1111 \ -DSERVER_OUT_QUEUE_SIZE=0 \ @@ -92,26 +90,25 @@ RUN cmake \ -DTEST_MYSQL_USER=fail_test \ -DVERBOSE_MAKE=OFF \ -D_filename=/usr/include/wx-3.0/wx/version.h \ - - # ;-separated list + # ;-separated list \ -Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \ - + # \ -Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \ .. # We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step # (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly. -RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) +# RUN cmake --build . --target libfailbochs_external-configure \ +# && cmake --build . +RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) \ + && cmake --build . -- -j$(nproc) -# Make FAIL* -RUN cmake --build . -- -j$(nproc) - -RUN ln -s /home/fail/fail/build-tracer/bin/fail-client /home/fail/bin/fail-x86-tracing; \ - ln -s /home/fail/fail/build-tracer/bin/import-trace /home/fail/bin/; \ - ln -s /home/fail/fail/build-tracer/bin/prune-trace /home/fail/bin/; \ - ln -s /home/fail/fail/build-tracer/bin/dump-trace /home/fail/bin/; \ - ln -s /home/fail/fail/build-tracer/bin/convert-trace /home/fail/bin/; \ - cp /home/fail/fail/tools/bochs-experiment-runner/bochs-experiment-runner.py /home/fail/bin/bochs-experiment-runner.py; \ - chmod a+x /home/fail/bin/bochs-experiment-runner.py; +RUN ln -s /home/fail/fail/build-tracer/bin/fail-client /home/fail/bin/fail-x86-tracing \ + && ln -s /home/fail/fail/build-tracer/bin/import-trace /home/fail/bin/ \ + && ln -s /home/fail/fail/build-tracer/bin/prune-trace /home/fail/bin/ \ + && ln -s /home/fail/fail/build-tracer/bin/dump-trace /home/fail/bin/ \ + && ln -s /home/fail/fail/build-tracer/bin/convert-trace /home/fail/bin/ \ + && cp /home/fail/fail/tools/bochs-experiment-runner/bochs-experiment-runner.py /home/fail/bin/bochs-experiment-runner.py \ + && chmod a+x /home/fail/bin/bochs-experiment-runner.py USER root