11# Use the official Docker Hub Ubuntu base image
22ARG BASE_IMAGE="ubuntu:24.04"
3- FROM $BASE_IMAGE
3+ FROM ${ BASE_IMAGE} AS common
44
5- # Prevent needing to configure debian packages, stopping the setup of
6- # the docker container.
7- RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
5+ USER root
86
9- RUN apt-get update && apt-get install -y --no-install-recommends \
7+ ARG TIMESKETCH_USER_NAME="timesketch"
8+ ARG TIMESKETCH_USER_UID="1000"
9+ ARG TIMESKETCH_USER_GID="1000"
10+ ARG TIMESKETCH_CONF_DIR="/etc/timesketch"
11+ RUN if ! id -u "${TIMESKETCH_USER_UID}" &>/dev/null; then \
12+ echo "Creating user ${USER_NAME} (${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID})..." ; \
13+ if getent group "${TIMESKETCH_USER_GID}" >/dev/null; then \
14+ echo "Group with GID ${TIMESKETCH_USER_GID} already exists." ; \
15+ else \
16+ echo "Creating group ${TIMESKETCH_USER_NAME} with GID ${TIMESKETCH_USER_GID}..." ; \
17+ groupadd -g "${TIMESKETCH_USER_GID}" "${TIMESKETCH_USER_NAME}" ; \
18+ fi; \
19+ useradd -m -u "${TIMESKETCH_USER_UID}" -g "${TIMESKETCH_USER_GID}" -s /bin/bash "${TIMESKETCH_USER_NAME}" ; \
20+ else \
21+ echo "User with UID ${TIMESKETCH_USER_UID} already exists." ; \
22+ fi \
23+ && for d in "${TIMESKETCH_CONF_DIR}" "/usr/local/src/sigma" ; do \
24+ mkdir -p "${d}" \
25+ && chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" "${d}" ; \
26+ done \
27+ && echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
28+ && apt-get update \
29+ && apt-get install -y --no-install-recommends \
1030 software-properties-common \
1131 apt-transport-https \
1232 apt-utils \
@@ -26,6 +46,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
2646 python3-venv \
2747 && rm -rf /var/lib/apt/lists/*
2848
49+ FROM common AS common-python
50+
2951# Install Plaso
3052ARG GIFT_PPA_TRACK="stable"
3153ARG GIFT_PPA_URL="http://ppa.launchpad.net/gift/${GIFT_PPA_TRACK}/ubuntu"
@@ -39,12 +61,70 @@ RUN set -eux \
3961 && apt-get install -y --no-install-recommends \
4062 plaso-tools \
4163 && apt-get clean \
42- && rm -rf /var/lib/apt/lists/* ~ /.gnupg
64+ && rm -rf /var/lib/apt/lists/* /root /.gnupg
4365
4466# Fix for broken PPA dependency in Ubuntu 24.04: Plaso needs the 'events'
4567# library for its opensearch output module.
4668RUN pip3 install --break-system-packages events
4769
70+ ARG PYTHON_PIP_CONF=""
71+ RUN if [ -n "${PYTHON_PIP_CONF}" ]; then \
72+ mkdir -p /root/.config/pip /home/${TIMESKETCH_USER_NAME}/.config/pip; \
73+ env echo -e "${PYTHON_PIP_CONF}" > /root/.config/pip/pip.conf; \
74+ cp /root/.config/pip/pip.conf /home/${TIMESKETCH_USER_NAME}/.config/pip/pip.conf; \
75+ chown -R "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" /home/${TIMESKETCH_USER_NAME}/.config; \
76+ fi
77+
78+ USER "${TIMESKETCH_USER_NAME}"
79+
80+ # Install dependencies for Timesketch in a virtual environment
81+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["api_client" , "/usr/local/src/timesketch/api_client/" ]
82+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["cli_client" , "/usr/local/src/timesketch/cli_client/" ]
83+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["end_to_end_tests" , "/usr/local/src/timesketch/end_to_end_tests/" ]
84+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["importer_client" , "/usr/local/src/timesketch/importer_client/" ]
85+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["timesketch" , "/usr/local/src/timesketch/timesketch/" ]
86+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["tests" , "/usr/local/src/timesketch/tests/" ]
87+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" [ \
88+ "requirements.txt" , \
89+ "setup.py" , \
90+ "test_requirements.txt" , \
91+ "/usr/local/src/timesketch/" \
92+ ]
93+
94+ RUN python3 -m venv --upgrade-deps --system-site-packages "${HOME}/venv" \
95+ && . "${HOME}/venv/bin/activate" \
96+ && pip install --no-cache-dir \
97+ -r /usr/local/src/timesketch/requirements.txt \
98+ -r /usr/local/src/timesketch/test_requirements.txt \
99+ && pip install -e /usr/local/src/timesketch
100+
101+ # Update the PATH to include the virtual environment
102+ ENV PATH="/home/${TIMESKETCH_USER_NAME}/venv/bin:${PATH}"
103+ ENV TIMESKETCH_CONF_DIR="${TIMESKETCH_CONF_DIR}"
104+
105+ FROM common-python AS setup
106+
107+ COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/setup-docker-entrypoint.sh" , "/usr/local/bin/docker-entrypoint.sh" ]
108+ ENTRYPOINT ["docker-entrypoint.sh" ]
109+
110+ FROM common-python AS celery-worker
111+
112+ COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/celery-worker-docker-entrypoint.sh" , "/usr/local/bin/docker-entrypoint.sh" ]
113+ ENTRYPOINT ["docker-entrypoint.sh" ]
114+
115+ FROM common-python AS gunicorn
116+
117+ COPY --chown=root:root --chmod=755 ["contrib/docker/dev/timesketch/gunicorn-docker-entrypoint.sh" , "/usr/local/bin/docker-entrypoint.sh" ]
118+
119+ HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --start-interval=2s --retries=1 \
120+ CMD ["curl" , "-f" , "-s" , "http://localhost:5000/" ]
121+
122+ ENTRYPOINT ["docker-entrypoint.sh" ]
123+
124+ FROM common AS vue-cli-service
125+
126+ USER root
127+
48128# Install NodeJS for frontend development
49129ARG NODE_VERSION="20.x"
50130ARG NODE_PPA_URL="https://deb.nodesource.com/node_${NODE_VERSION}"
@@ -56,43 +136,35 @@ RUN set -eux \
56136 && apt-get install -y --no-install-recommends \
57137 nodejs \
58138 && apt-get clean \
59- && rm -rf /var/lib/apt/lists/* ~ /.gnupg
139+ && rm -rf /var/lib/apt/lists/* /root /.gnupg
60140
141+ ARG TIMESKETCH_USER_NAME="timesketch"
142+ ARG TIMESKETCH_USER_UID="1000"
143+ ARG TIMESKETCH_USER_GID="1000"
61144ARG NODE_NPMRC=""
62145RUN if [ -n "${NODE_NPMRC}" ]; then \
63- env echo -e "${NODE_NPMRC}" > ~/.npmrc; \
146+ env echo -e "${NODE_NPMRC}" > /root/.npmrc; \
147+ cp /root/.npmrc /home/${TIMESKETCH_USER_NAME}/.npmrc; \
148+ chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" /home/${TIMESKETCH_USER_NAME}/.npmrc; \
64149 fi
65150
66151ARG YARN_YARNRC=""
67152RUN if [ -n "${YARN_YARNRC}" ]; then \
68- env echo -e "${YARN_YARNRC}" > ~/.yarnrc; \
69- fi
70-
71- ARG PYTHON_PIP_CONF=""
72- RUN if [ -n "${PYTHON_PIP_CONF}" ]; then \
73- mkdir -p ~/.config/pip; \
74- env echo -e "${PYTHON_PIP_CONF}" > ~/.config/pip/pip.conf; \
153+ env echo -e "${YARN_YARNRC}" > /root/.yarnrc; \
154+ cp /root/.yarnrc /home/${TIMESKETCH_USER_NAME}/.yarnrc; \
155+ chown "${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" /home/${TIMESKETCH_USER_NAME}/.yarnrc; \
75156 fi
76157
77158# Install Yarn for frontend development
78159RUN npm install --global yarn
79160
80- # Install dependencies for Timesketch in a virtual environment
81- COPY ["requirements.txt" , "/timesketch-requirements.txt" ]
82- COPY ["test_requirements.txt" , "/timesketch-test-requirements.txt" ]
83- RUN python3 -m venv --upgrade-deps --system-site-packages /opt/venv \
84- && . /opt/venv/bin/activate \
85- && pip install --no-cache-dir \
86- -r /timesketch-requirements.txt \
87- -r /timesketch-test-requirements.txt \
88- psycopg2-binary
161+ USER "${TIMESKETCH_USER_NAME}"
89162
90- # Update the PATH to include the virtual environment
91- ENV PATH="/opt/venv/bin:${PATH}"
163+ COPY --chown="${TIMESKETCH_USER_UID}:${TIMESKETCH_USER_GID}" ["timesketch" , "/usr/local/src/timesketch/timesketch/" ]
92164
93- # Copy the entrypoint script into the container
94- COPY [ "contrib/docker/dev/ timesketch/docker-entrypoint.sh" , "/" ]
95- RUN chmod a+x /docker-entrypoint.sh
165+ RUN if ! yarn --cwd=/usr/local/src/timesketch/timesketch/frontend-ng install; then \
166+ yarn --cwd=/usr/local/src/ timesketch/timesketch/frontend-ng install --no-lockfile; \
167+ fi
96168
97- # Load the entrypoint script to be run later
98- ENTRYPOINT ["/ docker-entrypoint.sh" ]
169+ COPY --chown=root:root --chmod=755 [ "contrib/docker/dev/timesketch/vue-cli-service-docker- entrypoint.sh" , "/usr/local/bin/docker-entrypoint.sh" ]
170+ ENTRYPOINT ["docker-entrypoint.sh" ]
0 commit comments