diff --git a/.gitignore b/.gitignore
index 85d660672c..e0df115492 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@
.settings
pom.xml.versionsBackup
target
+tez-dist/src/docker/cache/
diff --git a/tez-dag/src/main/resources/tez-container-log4j.properties b/tez-dag/src/main/resources/tez-container-log4j.properties
index 7cebec3289..4525d7018f 100644
--- a/tez-dag/src/main/resources/tez-container-log4j.properties
+++ b/tez-dag/src/main/resources/tez-container-log4j.properties
@@ -21,9 +21,16 @@ log4j.rootLogger=${tez.root.logger}
log4j.threshold=ALL
#
-# ContainerLog Appender
+# Console Appender
#
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.target=System.out
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%p] [%t] |%c{2}|: %m%n
+#
+# ContainerLog Appender
+#
log4j.appender.CLA=org.apache.tez.common.TezContainerLogAppender
log4j.appender.CLA.containerLogDir=${yarn.app.container.log.dir}
diff --git a/tez-dist/pom.xml b/tez-dist/pom.xml
index 9777d0c0b9..fff9980c53 100644
--- a/tez-dist/pom.xml
+++ b/tez-dist/pom.xml
@@ -118,6 +118,34 @@
+
+ docker
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ build-docker-image
+ package
+
+ exec
+
+
+ /bin/bash
+
+ ${project.basedir}/src/docker/build-docker.sh
+ -tez ${project.version}
+ -repo apache
+
+
+
+
+
+
+
+
diff --git a/tez-dist/src/docker/Dockerfile b/tez-dist/src/docker/Dockerfile
new file mode 100644
index 0000000000..883652246b
--- /dev/null
+++ b/tez-dist/src/docker/Dockerfile
@@ -0,0 +1,71 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+ARG BUILD_ENV=unarchive
+
+# hadolint ignore=DL3006
+FROM ubuntu AS unarchive
+# hadolint ignore=DL3010
+ONBUILD COPY tez-*.tar.gz /opt
+
+# hadolint ignore=DL3006
+FROM ${BUILD_ENV} AS env
+ARG TEZ_VERSION
+
+RUN mkdir -p /opt/tez \
+ && tar -xzv \
+ -f /opt/tez-$TEZ_VERSION.tar.gz \
+ -C /opt/tez \
+ && rm -rf /opt/tez-$TEZ_VERSION.tar.gz
+
+FROM eclipse-temurin:21-jdk-ubi9-minimal AS run
+
+ARG UID=1000
+ARG TEZ_VERSION
+
+# Install dependencies
+# hadolint ignore=DL3041
+RUN set -ex; \
+ microdnf update -y; \
+ microdnf -y install procps gettext findutils hostname; \
+ microdnf clean all; \
+ useradd --no-create-home -s /sbin/nologin -c "" --uid $UID tez
+
+# Set necessary environment variables
+ENV TEZ_HOME=/opt/tez \
+ TEZ_CONF_DIR=/opt/tez/conf
+
+ENV TEZ_CLIENT_VERSION=$TEZ_VERSION
+
+ENV PATH=$TEZ_HOME/bin:$PATH
+
+COPY --from=env --chown=tez /opt/tez $TEZ_HOME
+
+RUN mkdir -p $TEZ_CONF_DIR && chown tez:tez $TEZ_CONF_DIR
+
+COPY --chown=tez tez-am-entrypoint.sh /
+COPY --chown=tez conf $TEZ_CONF_DIR
+
+# Create Extension Point Directory
+RUN mkdir -p /opt/tez/plugins && chown tez:tez /opt/tez/plugins && chmod 755 /opt/tez/plugins
+
+RUN chmod +x /tez-am-entrypoint.sh
+
+USER tez
+WORKDIR $TEZ_HOME
+
+ENTRYPOINT ["/tez-am-entrypoint.sh"]
diff --git a/tez-dist/src/docker/README.md b/tez-dist/src/docker/README.md
new file mode 100644
index 0000000000..0c15f613b9
--- /dev/null
+++ b/tez-dist/src/docker/README.md
@@ -0,0 +1,95 @@
+
+
+# Tez AM Docker
+
+1. Building the docker image:
+
+ ```bash
+ mvn clean install -DskipTests -Pdocker
+ ```
+
+2. Install zookeeper in mac by:
+
+ ```bash
+ brew install zookeeper
+ zkServer start
+ ```
+
+3. Running the Tez AM container:
+
+ ```bash
+ export TEZ_VERSION=1.0.0-SNAPSHOT
+
+ docker run --rm \
+ -p 10001:10001 \
+ --env-file tez-dist/src/docker/tez.env \
+ --name tez-am \
+ --hostname localhost \
+ apache/tez-am:$TEZ_VERSION
+ ```
+
+ * `TEZ_VERSION` corresponds to the Maven `${project.version}`.
+ Set this environment variable in your shell before running the commands.
+ * Expose ports using the `-p` flag based on the
+ `tez.am.client.am.port-range` property in `tez-site.xml`.
+ * The `--hostname` flag configures the container's hostname, allowing
+ services on the host (e.g., macOS) to connect to it.
+ * Ensure the `--env-file` flag is included, or at a minimum, pass
+ `-e TEZ_FRAMEWORK_MODE=STANDALONE_ZOOKEEPER` to the `docker run` command.
+
+4. Debugging the Tez AM container:
+Uncomment the `JAVA_TOOL_OPTIONS` in `tez.env` and expose 5005 port using `-p` flag
+
+ ```bash
+ docker run --rm \
+ -p 10001:10001 -p 5005:5005 \
+ --env-file tez-dist/src/docker/tez.env \
+ --name tez-am \
+ --hostname localhost \
+ apache/tez-am:$TEZ_VERSION
+ ```
+
+5. To override the tez-site.xml in docker image use:
+ * Set the `TEZ_CUSTOM_CONF_DIR` environment variable in `tez.env`
+ or via the `docker run` command (e.g., `/opt/tez/custom-conf`).
+
+ ```bash
+ export TEZ_SITE_PATH=$(pwd)/tez-dist/src/docker/conf/tez-site.xml
+
+ docker run --rm \
+ -p 10001:10001 \
+ --env-file tez-dist/src/docker/tez.env \
+ -v "$TEZ_SITE_PATH:/opt/tez/custom-conf/tez-site.xml" \
+ --name tez-am \
+ --hostname localhost \
+ apache/tez-am:$TEZ_VERSION
+ ```
+
+6. To add plugin jars in docker image use:
+ * The plugin directory path inside the Docker container is fixed at `/opt/tez/plugins`.
+
+ ```bash
+ docker run --rm \
+ -p 10001:10001 \
+ --env-file tez-dist/src/docker/tez.env \
+ -v "/path/to/your/local/plugins:/opt/tez/plugins" \
+ --name tez-am \
+ --hostname localhost \
+ apache/tez-am:$TEZ_VERSION
+ ```
diff --git a/tez-dist/src/docker/build-docker.sh b/tez-dist/src/docker/build-docker.sh
new file mode 100755
index 0000000000..91926cf33f
--- /dev/null
+++ b/tez-dist/src/docker/build-docker.sh
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -xeou pipefail
+
+TEZ_VERSION=
+REPO=
+
+usage() {
+ cat <&2
+Usage: $0 [-h] [-tez ] [-repo ]
+Build the Apache Tez AM Docker image
+-help Display help
+-tez Build image with the specified Tez version
+-repo Docker repository
+EOF
+}
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -h)
+ usage
+ exit 0
+ ;;
+ -tez)
+ shift
+ TEZ_VERSION=$1
+ shift
+ ;;
+ -repo)
+ shift
+ REPO=$1
+ shift
+ ;;
+ *)
+ shift
+ ;;
+ esac
+done
+
+SCRIPT_DIR=$(
+ cd "$(dirname "$0")"
+ pwd
+)
+
+DIST_DIR=${DIST_DIR:-"$SCRIPT_DIR/../.."}
+PROJECT_ROOT=${PROJECT_ROOT:-"$SCRIPT_DIR/../../.."}
+
+REPO=${REPO:-apache}
+WORK_DIR="$(mktemp -d)"
+CACHE_DIR="$SCRIPT_DIR/cache"
+mkdir -p "$CACHE_DIR"
+
+# Defaults Tez versions from pom.xml if not provided
+TEZ_VERSION=${TEZ_VERSION:-$(mvn -f "$PROJECT_ROOT/pom.xml" -q help:evaluate -Dexpression=project.version -DforceStdout)}
+
+#####################################
+# Pick tez tarball from local build #
+#####################################
+TEZ_FILE_NAME="tez-$TEZ_VERSION.tar.gz"
+LOCAL_DIST_PATH="$DIST_DIR/target/$TEZ_FILE_NAME"
+
+if [ -f "$LOCAL_DIST_PATH" ]; then
+ echo "--> Found local Tez build artifact at: $LOCAL_DIST_PATH"
+ cp "$LOCAL_DIST_PATH" "$WORK_DIR/"
+else
+ echo "--> Error: Local Tez artifact not found at $LOCAL_DIST_PATH"
+ echo "--> Please build the project first (e.g., mvn clean install -DskipTests)."
+ exit 1
+fi
+
+# -------------------------------------------------------------------------
+# BUILD CONTEXT PREPARATION
+# -------------------------------------------------------------------------
+cp -R "$SCRIPT_DIR/conf" "$WORK_DIR/" 2>/dev/null || mkdir -p "$WORK_DIR/conf"
+cp "$SCRIPT_DIR/tez-am-entrypoint.sh" "$WORK_DIR/"
+cp "$SCRIPT_DIR/Dockerfile" "$WORK_DIR/"
+
+echo "Building Docker image..."
+docker build \
+ "$WORK_DIR" \
+ -f "$WORK_DIR/Dockerfile" \
+ -t "$REPO/tez-am:$TEZ_VERSION" \
+ --build-arg "BUILD_ENV=unarchive" \
+ --build-arg "TEZ_VERSION=$TEZ_VERSION"
+
+rm -r "${WORK_DIR}"
+echo "Docker image $REPO/tez-am:$TEZ_VERSION built successfully."
diff --git a/tez-dist/src/docker/conf/tez-site.xml b/tez-dist/src/docker/conf/tez-site.xml
new file mode 100644
index 0000000000..b1b2b55caa
--- /dev/null
+++ b/tez-dist/src/docker/conf/tez-site.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ tez.am.client.am.port-range
+ 10001-10003
+
+
+
+ tez.am.tez-ui.webservice.enable
+ false
+
+
+
+ tez.am.zookeeper.quorum
+ host.docker.internal:2181
+
+
+
+ tez.am.log.level
+ DEBUG
+
+
+
+
+
+ tez.local.mode
+ true
+
+
+
diff --git a/tez-dist/src/docker/tez-am-entrypoint.sh b/tez-dist/src/docker/tez-am-entrypoint.sh
new file mode 100644
index 0000000000..a01f3042b5
--- /dev/null
+++ b/tez-dist/src/docker/tez-am-entrypoint.sh
@@ -0,0 +1,114 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -xeou pipefail
+
+################################################
+# 1. Mocking DAGAppMaster#main() env variables #
+################################################
+
+: "${CONTAINER_ID:="container_1700000000000_0001_01_000001"}"
+: "${USER:="tez"}"
+: "${HADOOP_USER_NAME:="tez"}"
+: "${NM_HOST:="localhost"}"
+: "${NM_PORT:="12345"}"
+: "${NM_HTTP_PORT:="8042"}"
+: "${LOCAL_DIRS:="/tmp"}"
+: "${LOG_DIRS:="/opt/tez/logs"}"
+: "${APP_SUBMIT_TIME_ENV:=$(($(date +%s) * 1000))}"
+: "${TEZ_AM_EXTERNAL_ID:="tez-session-$(hostname)"}"
+
+export CONTAINER_ID USER HADOOP_USER_NAME NM_HOST NM_PORT NM_HTTP_PORT \
+ LOCAL_DIRS LOG_DIRS APP_SUBMIT_TIME_ENV TEZ_AM_EXTERNAL_ID
+
+mkdir -p "$LOG_DIRS"
+
+###########################
+# Custom Config directory #
+###########################
+if [[ -n "${TEZ_CUSTOM_CONF_DIR:-}" ]] && [[ -d "$TEZ_CUSTOM_CONF_DIR" ]]; then
+ echo "--> Using custom configuration directory: $TEZ_CUSTOM_CONF_DIR"
+ find "${TEZ_CUSTOM_CONF_DIR}" -type f -exec \
+ ln -sf {} "${TEZ_CONF_DIR}"/ \;
+
+ # Remove template keyword if it exists
+ if [[ -f "$TEZ_CONF_DIR/tez-site.xml.template" ]]; then
+ envsubst < "$TEZ_CONF_DIR/tez-site.xml.template" > "$TEZ_CONF_DIR/tez-site.xml"
+ fi
+fi
+
+#############
+# CLASSPATH #
+#############
+
+# Order is: conf -> plugins -> tez jars
+CLASSPATH="${TEZ_CONF_DIR}"
+
+# Custom Plugins
+# This allows mounting a volume at /opt/tez/plugins containing aux jars
+PLUGIN_DIR="/opt/tez/plugins"
+if [[ -d "$PLUGIN_DIR" ]]; then
+ count=$(find "$PLUGIN_DIR" -maxdepth 1 -name "*.jar" 2>/dev/null | wc -l)
+ if [ "$count" != "0" ]; then
+ echo "--> Found $count plugin jars. Prepending to classpath."
+ CLASSPATH="${CLASSPATH}:${PLUGIN_DIR}/*"
+ fi
+fi
+
+# Tez Jars
+CLASSPATH="${CLASSPATH}:${TEZ_HOME}/*:${TEZ_HOME}/lib/*"
+
+#############
+# Execution #
+#############
+TEZ_DAG_JAR=$(find "$TEZ_HOME" -maxdepth 1 -name "tez-dag-*.jar" ! -name "*-tests.jar" | head -n 1)
+
+if [ -z "$TEZ_DAG_JAR" ]; then
+ echo "Error: Could not find tez-dag-*.jar in $TEZ_HOME"
+ exit 1
+fi
+
+echo "--> Starting DAGAppMaster..."
+
+: "${TEZ_AM_HEAP_OPTS:="-Xmx2048m"}"
+# : "${TEZ_AM_GC_OPTS:="-Xlog:gc*=info,class+load=info::time,uptime,level,tags -XX:+UseNUMA"}"
+
+JAVA_ADD_OPENS=(
+ "--add-opens=java.base/java.lang=ALL-UNNAMED"
+ "--add-opens=java.base/java.util=ALL-UNNAMED"
+ "--add-opens=java.base/java.io=ALL-UNNAMED"
+ "-Dnet.bytebuddy.experimental=true"
+)
+
+read -r -a JAVA_OPTS_ARR <<< "${JAVA_OPTS:-}"
+read -r -a HEAP_OPTS_ARR <<< "${TEZ_AM_HEAP_OPTS}"
+# read -r -a JAVA_GC_OPTS_ARR <<< "${TEZ_AM_GC_OPTS}"
+
+# Add "${JAVA_GC_OPTS_ARR[@]}" in following command to get gc information.
+exec java "${HEAP_OPTS_ARR[@]}" "${JAVA_OPTS_ARR[@]}" "${JAVA_ADD_OPENS[@]}" \
+ -Djava.net.preferIPv4Stack=true \
+ -Djava.io.tmpdir="$PWD/tmp" \
+ -Dtez.root.logger=INFO,CLA,console \
+ -Dlog4j.configuratorClass=org.apache.tez.common.TezLog4jConfigurator \
+ -Dlog4j.configuration=tez-container-log4j.properties \
+ -Dyarn.app.container.log.dir="$LOG_DIRS" \
+ -Duser.name="$HADOOP_USER_NAME" \
+ -Dtez.conf.dir="$TEZ_CONF_DIR" \
+ -cp "$CLASSPATH" \
+ org.apache.tez.dag.app.DAGAppMaster --session \
+ "$@"
diff --git a/tez-dist/src/docker/tez.env b/tez-dist/src/docker/tez.env
new file mode 100644
index 0000000000..832bb986da
--- /dev/null
+++ b/tez-dist/src/docker/tez.env
@@ -0,0 +1,32 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Tez AM Container Environment Configuration
+
+CONTAINER_ID=container_1700000000000_0001_01_000001
+USER=tez
+HADOOP_USER_NAME=tez
+NM_HOST=localhost
+NM_PORT=12345
+NM_HTTP_PORT=8042
+LOG_DIRS=/opt/tez/logs
+TEZ_FRAMEWORK_MODE=STANDALONE_ZOOKEEPER
+TEZ_CUSTOM_CONF_DIR=/opt/tez/custom-conf
+# TEZ_AM_HEAP_OPTS configures the maximum heap size (Xmx) for the Tez AM.
+TEZ_AM_HEAP_OPTS=-Xmx2048m
+# Enable remote debugging on port 5005
+# JAVA_TOOL_OPTIONS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005'