|
| 1 | +# Apache Ambari Base Image |
| 2 | +# Multi-stage build for optimized production image |
| 3 | + |
| 4 | +ARG UBUNTU_VERSION=22.04 |
| 5 | +FROM ubuntu:${UBUNTU_VERSION} as base |
| 6 | + |
| 7 | +# Metadata |
| 8 | +LABEL maintainer="Apache Ambari Community <dev@ambari.apache.org>" |
| 9 | +LABEL org.apache.ambari.version="3.0.0-SNAPSHOT" |
| 10 | +LABEL org.apache.ambari.component="base" |
| 11 | +LABEL org.opencontainers.image.source="https://github.com/apache/ambari" |
| 12 | +LABEL org.opencontainers.image.description="Apache Ambari Base Runtime Image" |
| 13 | +LABEL org.opencontainers.image.licenses="Apache-2.0" |
| 14 | + |
| 15 | +# Build arguments |
| 16 | +ARG JAVA_VERSION=11 |
| 17 | +ARG MAVEN_VERSION=3.9.6 |
| 18 | +ARG NODE_VERSION=18 |
| 19 | +ARG PYTHON_VERSION=3.10 |
| 20 | + |
| 21 | +# Environment variables |
| 22 | +ENV DEBIAN_FRONTEND=noninteractive |
| 23 | +ENV TZ=UTC |
| 24 | +ENV LANG=C.UTF-8 |
| 25 | +ENV LC_ALL=C.UTF-8 |
| 26 | + |
| 27 | +# Create ambari user and group |
| 28 | +RUN groupadd -r ambari --gid=1000 && \ |
| 29 | + useradd -r -g ambari --uid=1000 --home-dir=/opt/ambari --shell=/bin/bash ambari && \ |
| 30 | + mkdir -p /opt/ambari && \ |
| 31 | + chown -R ambari:ambari /opt/ambari |
| 32 | + |
| 33 | +# Install system dependencies |
| 34 | +RUN apt-get update && \ |
| 35 | + apt-get install -y --no-install-recommends \ |
| 36 | + # Basic utilities |
| 37 | + curl \ |
| 38 | + wget \ |
| 39 | + unzip \ |
| 40 | + zip \ |
| 41 | + tar \ |
| 42 | + gzip \ |
| 43 | + ca-certificates \ |
| 44 | + gnupg \ |
| 45 | + lsb-release \ |
| 46 | + # Network tools |
| 47 | + net-tools \ |
| 48 | + netcat \ |
| 49 | + telnet \ |
| 50 | + openssh-client \ |
| 51 | + # System tools |
| 52 | + sudo \ |
| 53 | + vim \ |
| 54 | + less \ |
| 55 | + htop \ |
| 56 | + procps \ |
| 57 | + psmisc \ |
| 58 | + # Build tools (for native dependencies) |
| 59 | + build-essential \ |
| 60 | + gcc \ |
| 61 | + g++ \ |
| 62 | + make \ |
| 63 | + # Python and pip |
| 64 | + python3 \ |
| 65 | + python3-pip \ |
| 66 | + python3-dev \ |
| 67 | + python3-setuptools \ |
| 68 | + python3-wheel \ |
| 69 | + # Git for source management |
| 70 | + git \ |
| 71 | + # Database clients |
| 72 | + postgresql-client \ |
| 73 | + mysql-client \ |
| 74 | + # SSL/TLS support |
| 75 | + openssl \ |
| 76 | + # Time synchronization |
| 77 | + ntp \ |
| 78 | + ntpdate \ |
| 79 | + # Process management |
| 80 | + supervisor && \ |
| 81 | + # Clean up |
| 82 | + apt-get clean && \ |
| 83 | + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* |
| 84 | + |
| 85 | +# Install OpenJDK |
| 86 | +RUN apt-get update && \ |
| 87 | + apt-get install -y --no-install-recommends openjdk-${JAVA_VERSION}-jdk && \ |
| 88 | + apt-get clean && \ |
| 89 | + rm -rf /var/lib/apt/lists/* |
| 90 | + |
| 91 | +# Set JAVA_HOME |
| 92 | +ENV JAVA_HOME=/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64 |
| 93 | +ENV PATH=${JAVA_HOME}/bin:${PATH} |
| 94 | + |
| 95 | +# Install Maven |
| 96 | +RUN wget -q https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/maven.tar.gz && \ |
| 97 | + tar -xzf /tmp/maven.tar.gz -C /opt && \ |
| 98 | + ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven && \ |
| 99 | + rm /tmp/maven.tar.gz |
| 100 | + |
| 101 | +ENV MAVEN_HOME=/opt/maven |
| 102 | +ENV PATH=${MAVEN_HOME}/bin:${PATH} |
| 103 | + |
| 104 | +# Install Node.js and npm |
| 105 | +RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - && \ |
| 106 | + apt-get install -y nodejs && \ |
| 107 | + npm install -g npm@latest && \ |
| 108 | + npm install -g brunch@latest && \ |
| 109 | + apt-get clean && \ |
| 110 | + rm -rf /var/lib/apt/lists/* |
| 111 | + |
| 112 | +# Install Python packages |
| 113 | +RUN pip3 install --no-cache-dir \ |
| 114 | + setuptools \ |
| 115 | + wheel \ |
| 116 | + requests \ |
| 117 | + pyyaml \ |
| 118 | + jinja2 \ |
| 119 | + psutil \ |
| 120 | + six |
| 121 | + |
| 122 | +# Create directory structure |
| 123 | +RUN mkdir -p \ |
| 124 | + /var/log/ambari-server \ |
| 125 | + /var/log/ambari-agent \ |
| 126 | + /var/log/ambari-metrics-collector \ |
| 127 | + /var/log/ambari-metrics-monitor \ |
| 128 | + /var/run/ambari-server \ |
| 129 | + /var/run/ambari-agent \ |
| 130 | + /var/run/ambari-metrics-collector \ |
| 131 | + /var/run/ambari-metrics-monitor \ |
| 132 | + /var/lib/ambari-server \ |
| 133 | + /var/lib/ambari-agent \ |
| 134 | + /var/lib/ambari-metrics-collector \ |
| 135 | + /etc/ambari-server/conf \ |
| 136 | + /etc/ambari-agent/conf \ |
| 137 | + /etc/ambari-metrics-collector/conf \ |
| 138 | + /etc/ambari-metrics-monitor/conf && \ |
| 139 | + chown -R ambari:ambari \ |
| 140 | + /var/log/ambari-* \ |
| 141 | + /var/run/ambari-* \ |
| 142 | + /var/lib/ambari-* \ |
| 143 | + /etc/ambari-* |
| 144 | + |
| 145 | +# Configure sudo for ambari user |
| 146 | +RUN echo "ambari ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/ambari && \ |
| 147 | + chmod 0440 /etc/sudoers.d/ambari |
| 148 | + |
| 149 | +# SSH configuration for multi-node setups |
| 150 | +RUN mkdir -p /home/ambari/.ssh && \ |
| 151 | + ssh-keygen -t rsa -N '' -f /home/ambari/.ssh/id_rsa && \ |
| 152 | + cat /home/ambari/.ssh/id_rsa.pub >> /home/ambari/.ssh/authorized_keys && \ |
| 153 | + chmod 600 /home/ambari/.ssh/authorized_keys && \ |
| 154 | + chmod 700 /home/ambari/.ssh && \ |
| 155 | + chown -R ambari:ambari /home/ambari/.ssh |
| 156 | + |
| 157 | +# Configure SSH daemon |
| 158 | +RUN mkdir -p /var/run/sshd && \ |
| 159 | + sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \ |
| 160 | + sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \ |
| 161 | + sed -i 's/UsePAM yes/UsePAM no/' /etc/ssh/sshd_config |
| 162 | + |
| 163 | +# Set up Maven repository cache |
| 164 | +RUN mkdir -p /home/ambari/.m2 && \ |
| 165 | + chown -R ambari:ambari /home/ambari/.m2 |
| 166 | + |
| 167 | +# Health check script |
| 168 | +COPY docker/scripts/health-check.sh /usr/local/bin/health-check.sh |
| 169 | +RUN chmod +x /usr/local/bin/health-check.sh |
| 170 | + |
| 171 | +# Entrypoint script |
| 172 | +COPY docker/scripts/entrypoint.sh /usr/local/bin/entrypoint.sh |
| 173 | +RUN chmod +x /usr/local/bin/entrypoint.sh |
| 174 | + |
| 175 | +# Set working directory |
| 176 | +WORKDIR /opt/ambari |
| 177 | + |
| 178 | +# Switch to ambari user |
| 179 | +USER ambari |
| 180 | + |
| 181 | +# Default command |
| 182 | +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] |
| 183 | +CMD ["bash"] |
| 184 | + |
| 185 | +# Build stage for development |
| 186 | +FROM base as build |
| 187 | + |
| 188 | +# Switch back to root for build tools |
| 189 | +USER root |
| 190 | + |
| 191 | +# Install additional build dependencies |
| 192 | +RUN apt-get update && \ |
| 193 | + apt-get install -y --no-install-recommends \ |
| 194 | + # Additional build tools |
| 195 | + cmake \ |
| 196 | + autoconf \ |
| 197 | + automake \ |
| 198 | + libtool \ |
| 199 | + pkg-config \ |
| 200 | + # Development headers |
| 201 | + libssl-dev \ |
| 202 | + libffi-dev \ |
| 203 | + libxml2-dev \ |
| 204 | + libxslt1-dev \ |
| 205 | + zlib1g-dev \ |
| 206 | + # RPM building tools |
| 207 | + rpm \ |
| 208 | + rpmbuild \ |
| 209 | + # Debugging tools |
| 210 | + gdb \ |
| 211 | + strace \ |
| 212 | + tcpdump && \ |
| 213 | + apt-get clean && \ |
| 214 | + rm -rf /var/lib/apt/lists/* |
| 215 | + |
| 216 | +# Install additional Python development packages |
| 217 | +RUN pip3 install --no-cache-dir \ |
| 218 | + pytest \ |
| 219 | + mock \ |
| 220 | + coverage \ |
| 221 | + flake8 \ |
| 222 | + pylint |
| 223 | + |
| 224 | +# Pre-download Maven dependencies for faster builds |
| 225 | +COPY pom.xml /tmp/pom.xml |
| 226 | +RUN cd /tmp && \ |
| 227 | + mvn dependency:go-offline -B -q && \ |
| 228 | + rm -rf /tmp/* |
| 229 | + |
| 230 | +# Switch back to ambari user |
| 231 | +USER ambari |
| 232 | + |
| 233 | +# Runtime stage for production |
| 234 | +FROM base as runtime |
| 235 | + |
| 236 | +# Copy only necessary files from build stage |
| 237 | +# This keeps the runtime image smaller |
| 238 | + |
| 239 | +# Health check |
| 240 | +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ |
| 241 | + CMD /usr/local/bin/health-check.sh |
| 242 | + |
| 243 | +# Expose common ports |
| 244 | +EXPOSE 8080 8441 8440 6188 61888 |
| 245 | + |
| 246 | +# Default volumes |
| 247 | +VOLUME ["/var/log/ambari-server", "/var/log/ambari-agent", "/var/log/ambari-metrics-collector"] |
| 248 | +VOLUME ["/var/lib/ambari-server", "/var/lib/ambari-agent", "/var/lib/ambari-metrics-collector"] |
| 249 | +VOLUME ["/etc/ambari-server/conf", "/etc/ambari-agent/conf", "/etc/ambari-metrics-collector/conf"] |
0 commit comments