refactor: major overhaul and cleanup of the build environment

- Removed `.env.sample` and improved `.env` handling
- Deleted `translate.py` and replaced it with `translate-md.py`
- Refactored `readme.yml` to enhance translation and tagging workflow
- Updated `.gitignore` with new exclusions
- Major restructuring of `Dockerfile`, including improved ENV variables and layout
- Extended `create-env.sh` with interactive prompts and validation
- Improved error handling and structure in `docker-compose-wrapper`
- Expanded `docker-compose.yml` with new environment variables and network settings
- Moved and updated `init.sh`, `.bashrc`, and other files to `files/` directory
- Added new scripts: `show-env.sh` for better diagnostics and `terminal-splash.txt` for enhanced display

These changes optimize the build environment for improved stability and flexibility.
This commit is contained in:
2025-02-11 18:20:58 +01:00
parent f823e7e8ee
commit 7ab5a410d3
12 changed files with 818 additions and 371 deletions

View File

@@ -1,196 +1,174 @@
## Use the official Debian 11 image based up debian:bullseye-slim as a base
# Dockerfile for Debian-based Tuxbox build environment
FROM dbt1/debian-tuxbox-base:v1.6
### Args
ARG PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
## Build arguments from docker-compose ##
# Internal information
ARG DOCKER_BUILDENV_VERSION=${DOCKER_BUILDENV_VERSION}
ARG DOCKER_BUILDENV_GIT_URL=$DOCKER_BUILDENV_GIT_URL
# URL to buildenv sources and where to install
ARG BUILDENV_GIT_URL=${BUILDENV_GIT_URL}
ARG BUILDENV_VERSION=${BUILDENV_VERSION}
ARG BUILDENV_PREFIX=${BUILDENV_PREFIX}
ARG TB_BUILD_TIME=${TB_BUILD_TIME}
# User and group
ARG USER_NAME=${USER_NAME}
ARG USER_ID=${USER_ID}
ARG USER_GROUP=${USER_GROUP}
ARG USER_GROUP_ID=${USER_GROUP_ID}
ARG USER_PASSWORD=${USER_PASSWORD}
ARG USER_DIR=${USER_DIR}
# More build args
ARG DISPLAY=${DISPLAY}
ARG ENABLE_UI_TOOLS=false
ARG ENABLE_UI_TOOLS=${ENABLE_UI_TOOLS}
ARG GIT_EMAIL=${GIT_EMAIL}
ARG GIT_USER=${GIT_USER}
ARG USER_GROUP_ID=${USER_GROUP_ID}
ARG HISTFILE_NAME=${HISTFILE_NAME}
ARG HISTFILE=${HISTFILE}
ARG HOST_PREFIX=${HOST_PREFIX}
ARG LOCALE_LANG=${LOCALE_LANG}
ARG BUILDENV_INSTALL_PREFIX=${BUILDENV_INSTALL_PREFIX}
ARG LOCAL_HOSTNAME=${LOCAL_HOSTNAME}
ARG LOCALE_LANG=${LOCALE_LANG}
ARG TZ=${TZ}
ARG TERM=${TERM}
ARG NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES}
ARG QT_QUICK_BACKEND=${QT_QUICK_BACKEND}
ARG QT_XCB_GL_INTEGRATION=${QT_XCB_GL_INTEGRATION}
ARG USER_VOLUME_WORKDIR=${USER_VOLUME_WORKDIR}
ARG USER_VOLUME_DATADIR=${USER_VOLUME_DATADIR}
ARG START_PATH=${START_PATH}
ARG TERM=${TERM}
ARG TZ=${TZ}
ARG USER=${USER}
ARG USER_DIR=${USER_DIR}
ARG USER_GROUP=${USER_GROUP}
ARG USER_ID=${USER_ID}
ARG USER_PASSWORD=${USER_PASSWORD}
ARG USER_VOLUME_WORKDIR=${USER_DIR}/${HOST_PREFIX}
ARG TB_VERSION=${TB_VERSION}
ARG WWW_DOCDIR=${WWW_DOCDIR}
ARG EXPLORER_ENABLE=${EXPLORER_ENABLE}
ARG EXPLORER_GIT_URL=${EXPLORER_GIT_URL}
ARG XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
ARG XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR}
## Add the user with default password
# Convert ARG to ENV for runtime usage
ENV DOCKER_BUILDENV_VERSION=${DOCKER_BUILDENV_VERSION}
ENV DISPLAY=${DISPLAY}
ENV DOCKER_BUILDENV_GIT_URL=$DOCKER_BUILDENV_GIT_URL
ENV BUILDENV_GIT_URL=$BUILDENV_GIT_URL
ENV ENABLE_UI_TOOLS=${ENABLE_UI_TOOLS}
ENV GIT_EMAIL=${GIT_EMAIL}
ENV GIT_USER=${GIT_USER}
ENV HISTFILE_NAME=${HISTFILE_NAME}
ENV HISTFILE=${HISTFILE}
ENV BUILDENV_INSTALL_PREFIX=${BUILDENV_INSTALL_PREFIX}
ENV LOCAL_HOSTNAME=${LOCAL_HOSTNAME}
ENV LOCALE_LANG=${LOCALE_LANG}
ENV TZ=${TZ}
ENV TERM=${TERM}
ENV NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES}
ENV QT_QUICK_BACKEND=${QT_QUICK_BACKEND}
ENV QT_XCB_GL_INTEGRATION=${QT_XCB_GL_INTEGRATION}
ENV USER=${USER_NAME}
ENV USER_ID=${USER_ID}
ENV USER_GROUP=${USER_GROUP}
ENV USER_GROUP_ID=${USER_GROUP_ID}
ENV USER_PASSWORD=${USER_PASSWORD}
ENV USER_DIR=${USER_DIR}
ENV USER_VOLUME_WORKDIR=${USER_VOLUME_WORKDIR}
ENV USER_VOLUME_DATADIR=${USER_VOLUME_DATADIR}
ENV START_PATH=${START_PATH}
ENV WWW_DOCDIR=${WWW_DOCDIR}
ENV EXPLORER_ENABLE=${EXPLORER_ENABLE}
ENV EXPLORER_GIT_URL=${EXPLORER_GIT_URL}
ENV XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
ENV XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR}
# Create user and group
RUN groupadd -g "${USER_GROUP_ID}" "${USER_GROUP}" && \
useradd -m -u "${USER_ID}" -g "${USER_GROUP_ID}" -s /bin/bash "${USER}" && \
echo "${USER}:${USER_PASSWORD}" | chpasswd
## Set the desired Locale
RUN locale-gen ${LOCALE_LANG} && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=${LOCALE_LANG}
# Set Locale
RUN sed -i "/${LOCALE_LANG}/s/^# //g" /etc/locale.gen && \
locale-gen ${LOCALE_LANG} && \
update-locale LANG="${LOCALE_LANG}"
### Some labels
LABEL maintainer="Thilo Graf <dbt@novatux.de>" \
maintainer.org="tuxbox-neutrino" \
maintainer.org.uri="https://tuxbox-neutrino.org" \
com.tuxbox-neutrino.project.repo.type="git" \
com.tuxbox-neutrino.project.repo.uri="https://github.com/dbt1/docker-tuxbox-build" \
com.tuxbox-neutrino.project.repo.issues="https://github.com/dbt1/docker-tuxbox-build/issues" \
com.tuxbox-neutrino.app.docker-tuxbox-build.version="${TB_VERSION}" \
# Open container labels
org.opencontainers.image.created="${TB_BUILD_TIME}" \
org.opencontainers.image.description="Debian based" \
org.opencontainers.image.vendor="tuxbox-neutrino" \
org.opencontainers.image.source="https://github.com/dbt1/docker-tuxbox-build" \
# Artifact hub annotations
io.artifacthub.package.readme-url="https://github.com/dbt1/docker-tuxbox-build/blob/master/README.md" \
io.artifacthub.package.logo-url="https://avatars.githubusercontent.com/u/22789022?s=200&v=4"
### ui package experimental atm
RUN if [ "$ENABLE_UI_TOOLS" = "true" ]; then \
apt-get update && apt-get install -y --no-install-recommends \
breeze-icon-theme \
meld \
dbus \
kdevelop; \
# Install UI tools (if enabled)
RUN if [ "${ENABLE_UI_TOOLS}" = "true" ]; then \
apt-get update && apt-get install -y --no-install-recommends \
breeze-icon-theme \
meld \
dbus \
kdevelop; \
fi
## avoid dbus warn messages
ENV NO_AT_BRIDGE=1
## Create some basic directories and permissions for X-Server
RUN mkdir -p $XDG_RUNTIME_DIR && chown -R root:root $XDG_RUNTIME_DIR && chmod 0700 $XDG_RUNTIME_DIR
RUN mkdir -p "${XDG_RUNTIME_DIR}" && chown -R root:root "${XDG_RUNTIME_DIR}" && chmod 0700 "${XDG_RUNTIME_DIR}"
## Copy welcome message
ENV BANNER_FILE=/etc/welcome.txt
COPY terminal-splash.txt /etc/terminal-splash.txt
COPY files/terminal-splash.txt /etc/terminal-splash.txt
RUN cat /etc/terminal-splash.txt > ${BANNER_FILE} && \
echo "--------------------------------------------------------------" >> ${BANNER_FILE} && \
echo "Tuxbox-Builder Version: ${TB_VERSION}" >> ${BANNER_FILE} && \
echo "Tuxbox docker-buildenv: v${DOCKER_BUILDENV_VERSION}" >> ${BANNER_FILE} && \
echo "--------------------------------------------------------------" >> ${BANNER_FILE}
### ssh stuff
# ssh service setup
ENV SSHD_RUN_SERVICE_DIR="/etc/service/sshd"
ENV SSHD_RUN="${SSHD_RUN_SERVICE_DIR}/run"
RUN mkdir /var/run/sshd && \
RUN mkdir -p /var/run/sshd && \
ssh-keygen -A && \
mkdir -p ${SSHD_RUN_SERVICE_DIR} && \
echo '#!/bin/sh' > ${SSHD_RUN} && \
echo 'exec /usr/sbin/sshd -D' >> ${SSHD_RUN} && \
chmod 755 ${SSHD_RUN}
mkdir -p "${SSHD_RUN_SERVICE_DIR}" && \
echo '#!/bin/sh' > "${SSHD_RUN}" && \
echo 'exec /usr/sbin/sshd -D' >> "${SSHD_RUN}" && \
chmod 755 "${SSHD_RUN}"
### Set timzone
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# Set timezone
RUN ln -snf /usr/share/zoneinfo/"${TZ}" /etc/localtime && echo "${TZ}" > /etc/timezone
## Lighttpd setup and create the runit service for lighttpd
ENV LIGHTTPD_RUN="/etc/service/lighttpd/run"
# Lighttpd setup
RUN apt update && apt install -y php-cgi php-cli php-common php-fpm php-mbstring && \
lighty-enable-mod fastcgi && \
lighty-enable-mod fastcgi-php && \
mkdir -p /run/lighttpd && \
chown -R www-data:www-data /run/lighttpd && \
chmod -R 755 /run/lighttpd
ENV LIGHTTPD_SERVICE_RUN="/etc/service/lighttpd/run"
ENV LIGHTTPD_CONFIG_PATH="/config/lighttpd"
ENV LIGHTTPD_STD_CONFIG_FILE="${LIGHTTPD_CONFIG_PATH}/lighttpd.conf"
ENV LIGHTTPD_ERROR_DOC="404.html"
RUN mkdir -p /etc/service/lighttpd && \
echo '#!/bin/sh' > ${LIGHTTPD_RUN} && \
echo "if [ ! -d ${LIGHTTPD_CONFIG_PATH} ]; then" >> ${LIGHTTPD_RUN} && \
echo " mkdir -p ${LIGHTTPD_CONFIG_PATH}" >> ${LIGHTTPD_RUN} && \
echo "fi" >> ${LIGHTTPD_RUN} && \
echo "" >> ${LIGHTTPD_RUN} && \
echo "if [ ! -f ${LIGHTTPD_STD_CONFIG_FILE} ]; then" >> ${LIGHTTPD_RUN} && \
echo " cp /etc/lighttpd/lighttpd.conf ${LIGHTTPD_STD_CONFIG_FILE}" >> ${LIGHTTPD_RUN} && \
echo " echo 'dir-listing.activate = \"enable\"' >> ${LIGHTTPD_STD_CONFIG_FILE}" >> ${LIGHTTPD_RUN} && \
echo " sed -i 's|/var/www/html|${USER_VOLUME_WORKDIR}/${BUILDENV_PREFIX}/dist|' ${LIGHTTPD_STD_CONFIG_FILE}" >> ${LIGHTTPD_RUN} && \
echo "fi" >> ${LIGHTTPD_RUN} && \
echo "" >> ${LIGHTTPD_RUN} && \
echo "exec lighttpd -D -f ${LIGHTTPD_STD_CONFIG_FILE}" >> ${LIGHTTPD_RUN} && \
chmod 755 ${LIGHTTPD_RUN}
echo '#!/bin/sh' > "${LIGHTTPD_SERVICE_RUN}" && \
echo "if [ ! -d ${LIGHTTPD_CONFIG_PATH} ]; then" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " mkdir -p ${LIGHTTPD_CONFIG_PATH}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "fi" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "if [ ! -f ${LIGHTTPD_STD_CONFIG_FILE} ]; then" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " cp /etc/lighttpd/lighttpd.conf ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " echo 'dir-listing.activate = \"enable\"' >> ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " echo 'server.follow-symlink = \"enable\"' >> ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " echo 'server.error-handler-404 = \"/${LIGHTTPD_ERROR_DOC}\"' >> ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo " sed -i 's|/var/www/html|${WWW_DOCDIR}|g' ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "fi" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "" >> "${LIGHTTPD_SERVICE_RUN}" && \
echo "exec lighttpd -D -f ${LIGHTTPD_STD_CONFIG_FILE}" >> "${LIGHTTPD_SERVICE_RUN}" && \
usermod -aG www-data "${USER}" && \
chmod 755 "${LIGHTTPD_SERVICE_RUN}"
### Start generate content of start script ###
# Copy helper scripts
COPY files/show-env.sh /usr/local/bin/show-env.sh
# Set the location of the init script and copy the init script from your project into the image
ENV CONTAINER_INIT_SCRIPT="/usr/local/bin/init.sh"
RUN echo "#!/bin/bash" > ${CONTAINER_INIT_SCRIPT} && \
echo "echo 'Initialize tuxbox-builder container...'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "chown -R ${USER}:${USER_GROUP} ${USER_DIR} ${USER_VOLUME_DATADIR}" >> ${CONTAINER_INIT_SCRIPT} && \
echo "usermod -aG sudo $USER" >> ${CONTAINER_INIT_SCRIPT}
COPY files/init.sh ${CONTAINER_INIT_SCRIPT}
RUN chmod +x ${CONTAINER_INIT_SCRIPT}
COPY files/.bashrc ${USER_DIR}/.bashrc
## prepare git config
RUN mkdir -p ${XDG_CONFIG_HOME}/git && \
echo "echo -e '[user]\\n\\temail = ${GIT_EMAIL}\\n\\tname = ${GIT_USER}' > ${XDG_CONFIG_HOME}/git/config" >> ${CONTAINER_INIT_SCRIPT} && \
echo "chown -R ${USER}:${USER_GROUP} ${XDG_CONFIG_HOME}/git" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo " >> ${CONTAINER_INIT_SCRIPT}
## Prepare buildenv script
RUN echo "if [ ! -d ${START_PATH}/.git ]; then" >> ${CONTAINER_INIT_SCRIPT} && \
echo " echo Cloning buildenv Repository from ${BUILDENV_GIT_URL}" >> ${CONTAINER_INIT_SCRIPT} && \
echo " git clone ${BUILDENV_GIT_URL} /tmp/${BUILDENV_PREFIX}" >> ${CONTAINER_INIT_SCRIPT} && \
echo " rsync -a /tmp/${BUILDENV_PREFIX} ${USER_VOLUME_WORKDIR}/" >> ${CONTAINER_INIT_SCRIPT} && \
echo " rm -rf ${USER_DIR}/${BUILDENV_PREFIX}/tmp" >> ${CONTAINER_INIT_SCRIPT} && \
echo "else" >> ${CONTAINER_INIT_SCRIPT} && \
echo " echo 'Repository [${START_PATH}] already exists. Not touched!'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "fi" >> ${CONTAINER_INIT_SCRIPT} && \
echo "chown -R ${USER}:${USER_GROUP} ${USER_VOLUME_WORKDIR}" >> ${CONTAINER_INIT_SCRIPT}
## prepare profile
ENV BASH_RC_FILE=${USER_DIR}/.bashrc
COPY .bashrc ${BASH_RC_FILE}
RUN echo "sed -i 's|@START_PATH@|'"${START_PATH}"'|' ${BASH_RC_FILE}" >> ${CONTAINER_INIT_SCRIPT} && \
echo "sed -i 's|@VERSION@|'"${TB_VERSION}"'|' ${BASH_RC_FILE}" >> ${CONTAINER_INIT_SCRIPT} && \
echo "sed -i 's|@HISTFILE@|'"${HISTFILE}"'|' ${BASH_RC_FILE}" >> ${CONTAINER_INIT_SCRIPT}
## prepare ssh config
RUN echo "mkdir -p ${USER_DIR}/.ssh" >> ${CONTAINER_INIT_SCRIPT}
## show env info
RUN echo "echo " >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo Environment:" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo BUILDENV_VERSION='${BUILDENV_VERSION}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo HOST_PREFIX='${HOST_PREFIX}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo BUILDENV_PREFIX='${BUILDENV_PREFIX}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo BUILDENV_GIT_URL='${BUILDENV_GIT_URL}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo TZ='${TZ}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER='${USER}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER_GROUP='${USER_GROUP}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER_ID='${USER_ID}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER_GROUP_ID='${USER_GROUP_ID}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER_DIR='${HOME}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo USER_PASSWORD=******" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo HISTFILE='${HISTFILE}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo GIT_USER='${GIT_USER}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo GIT_EMAIL='${GIT_EMAIL}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo PATH='${PATH}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo LOCALE_LANG='${LOCALE_LANG}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo START_PATH='${START_PATH}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo TB_VERSION='${TB_VERSION}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo TB_BUILD_TIME='${TB_BUILD_TIME}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo DISPLAY='${DISPLAY}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo ENABLE_UI_TOOLS='${ENABLE_UI_TOOLS} NOTE: Experimental only!'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo LOCAL_HOSTNAME='${LOCAL_HOSTNAME}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo HOSTNAME='$HOSTNAME'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo XDG_RUNTIME_DIR='${XDG_RUNTIME_DIR}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo XDG_CONFIG_HOME='${XDG_CONFIG_HOME}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo QT_QUICK_BACKEND='${QT_QUICK_BACKEND}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo QT_XCB_GL_INTEGRATION='${QT_XCB_GL_INTEGRATION}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo NVIDIA_VISIBLE_DEVICES='${NVIDIA_VISIBLE_DEVICES}'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "echo " >> ${CONTAINER_INIT_SCRIPT}
## start services
RUN echo "echo 'Ready...'" >> ${CONTAINER_INIT_SCRIPT} && \
echo "exec runsvdir -P /etc/service" >> ${CONTAINER_INIT_SCRIPT}
### END generate content of start script ###
# clean up
RUN apt-get autoremove -y && apt-get autoclean && apt-get clean && \
# Cleanup
RUN apt-get autoremove -y && apt-get autoclean -y && apt-get clean -y && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
## make start script executable
# Make init script executable
RUN chmod 755 "${CONTAINER_INIT_SCRIPT}"
# Start container with init script
ENTRYPOINT ["bash", "-c", "${CONTAINER_INIT_SCRIPT}"]
CMD ["D"]
ENTRYPOINT ["bash", "-c", "exec ${CONTAINER_INIT_SCRIPT:-/usr/local/bin/init.sh}"]
# Add HEALTHCHECK
HEALTHCHECK --interval=5s --timeout=5s --start-period=1s --retries=10 \
CMD [ -f /tmp/container_ready ] || exit 1