원본
# 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.
FROM ubuntu:20.04
LABEL maintainer="Apache Software Foundation <dev@zeppelin.apache.org>"
ENV Z_VERSION="0.12.0-SNAPSHOT"
ENV LOG_TAG="[ZEPPELIN_${Z_VERSION}]:" \
ZEPPELIN_HOME="/opt/zeppelin" \
HOME="/opt/zeppelin" \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
ZEPPELIN_ADDR="0.0.0.0"
RUN echo "$LOG_TAG install basic packages" && \
apt-get -y update && \
# Switch back to install JRE instead of JDK when moving to JDK9 or later.
DEBIAN_FRONTEND=noninteractive apt-get install -y locales language-pack-en tini openjdk-11-jdk-headless wget unzip && \
# Cleanup
rm -rf /var/lib/apt/lists/* && \
apt-get autoclean && \
apt-get clean
# Install conda to manage python and R packages
ARG miniconda_version="py39_24.1.2-0"
# Hashes via https://docs.conda.io/en/latest/miniconda_hashes.html
ARG miniconda_sha256="2ec135e4ae2154bb41e8df9ecac7ef23a7d6ca59fc1c8071cfe5298505c19140"
# Install python and R packages via conda
COPY env_python_3_with_R.yml /env_python_3_with_R.yml
RUN set -ex && \
wget -nv https://repo.anaconda.com/miniconda/Miniconda3-${miniconda_version}-Linux-x86_64.sh -O miniconda.sh && \
echo "${miniconda_sha256} miniconda.sh" > anaconda.sha256 && \
sha256sum --strict -c anaconda.sha256 && \
bash miniconda.sh -b -p /opt/conda && \
export PATH=/opt/conda/bin:$PATH && \
conda config --set always_yes yes --set changeps1 no && \
conda info -a && \
conda install mamba -c conda-forge && \
mamba env update -f /env_python_3_with_R.yml --prune && \
# Cleanup
rm -v miniconda.sh anaconda.sha256 && \
# Cleanup based on https://github.com/ContinuumIO/docker-images/commit/cac3352bf21a26fa0b97925b578fb24a0fe8c383
find /opt/conda/ -follow -type f -name '*.a' -delete && \
find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
mamba clean -ay
# Allow to modify conda packages. This allows malicious code to be injected into other interpreter sessions, therefore it is disabled by default
# chmod -R ug+rwX /opt/conda
ENV PATH /opt/conda/envs/python_3_with_R/bin:/opt/conda/bin:$PATH
RUN echo "$LOG_TAG Download Zeppelin binary" && \
mkdir -p ${ZEPPELIN_HOME} && \
wget -nv -O /tmp/zeppelin-${Z_VERSION}-bin-all.tgz https://archive.apache.org/dist/zeppelin/zeppelin-${Z_VERSION}/zeppelin-${Z_VERSION}-bin-all.tgz && \
tar --strip-components=1 -zxvf /tmp/zeppelin-${Z_VERSION}-bin-all.tgz -C ${ZEPPELIN_HOME} && \
rm -f /tmp/zeppelin-${Z_VERSION}-bin-all.tgz && \
chown -R root:root ${ZEPPELIN_HOME} && \
mkdir -p ${ZEPPELIN_HOME}/logs ${ZEPPELIN_HOME}/run ${ZEPPELIN_HOME}/webapps && \
# Allow process to edit /etc/passwd, to create a user entry for zeppelin
chgrp root /etc/passwd && chmod ug+rw /etc/passwd && \
# Give access to some specific folders
chmod -R 775 "${ZEPPELIN_HOME}/logs" "${ZEPPELIN_HOME}/run" "${ZEPPELIN_HOME}/notebook" "${ZEPPELIN_HOME}/conf" && \
# Allow process to create new folders (e.g. webapps)
chmod 775 ${ZEPPELIN_HOME} && \
chmod -R 775 /opt/conda
COPY log4j.properties ${ZEPPELIN_HOME}/conf/
COPY log4j_docker.properties ${ZEPPELIN_HOME}/conf/
COPY log4j2.properties ${ZEPPELIN_HOME}/conf/
COPY log4j2_docker.properties ${ZEPPELIN_HOME}/conf/
USER 1000
EXPOSE 8080
ENTRYPOINT [ "/usr/bin/tini", "--" ]
WORKDIR ${ZEPPELIN_HOME}
CMD ["bin/zeppelin.sh"]
분석
# 기본 이미지 설정
## Ubuntu 20.04를 기본 이미지로 사용하여 제플린 환경을 구축
FROM ubuntu:20.04
# 메타데이터와 환경 변수 설정
## LABEL은 이미지의 메타데이터를 지정
## 관리자의 이메일을 나타냄
## ENV는 여러 환경 변수를 설정
## Z_VERSION은 제플린의 버전를 지정
## ZEPPELIN_HOME은 제플린이 설치될 경로를 지정
## JAVA_HOME은 Java 11이 설치된 경로를 지정하여 자바 런타임 환경을 설정
LABEL maintainer="Apache Software Foundation <dev@zeppelin.apache.org>"
ENV Z_VERSION="0.12.0-SNAPSHOT"
ENV LOG_TAG="[ZEPPELIN_${Z_VERSION}]:" \
ZEPPELIN_HOME="/opt/zeppelin" \
HOME="/opt/zeppelin" \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
ZEPPELIN_ADDR="0.0.0.0"
# 필수 패키지 설치
## 필요한 기본 패키지들을 설치함
## 자바(JDK), tini(도커 init 시스템), wget, unzip 등
## 패키지 설치 후에 불필요한 파일들을 삭제하여 이미지의 크기를 줄임
RUN echo "$LOG_TAG install basic packages" && \
apt-get -y update && \
# Switch back to install JRE instead of JDK when moving to JDK9 or later.
DEBIAN_FRONTEND=noninteractive apt-get install -y locales language-pack-en tini openjdk-11-jdk-headless wget unzip && \
# Cleanup
rm -rf /var/lib/apt/lists/* && \
apt-get autoclean && \
apt-get clean
# Conda 설치 및 설정
## ARG는 도커 빌드 과정에서 사용될 변수를 정의
## miniconda_version과 해당 버전의 SHA256 해시값을 정의
## Conda는 Python과 R 패키지 관리를 위해 설치
## Miniconda 스크립트를 다운로드하고 검증한 후 설치
## mamba라는 패키지 관리 도구를 설치하고,
## 제공된 환경 파일(env_python_3_with_R.yml)을 사용하여 Python과 R 환경을 설정
## PATH 환경 변수를 설정하여 Conda 환경에서 Python과 R을 사용할 수 있게 설정
# Install conda to manage python and R packages
ARG miniconda_version="py39_24.1.2-0"
# Hashes via https://docs.conda.io/en/latest/miniconda_hashes.html
ARG miniconda_sha256="2ec135e4ae2154bb41e8df9ecac7ef23a7d6ca59fc1c8071cfe5298505c19140"
# Install python and R packages via conda
COPY env_python_3_with_R.yml /env_python_3_with_R.yml
RUN set -ex && \
wget -nv https://repo.anaconda.com/miniconda/Miniconda3-${miniconda_version}-Linux-x86_64.sh -O miniconda.sh && \
echo "${miniconda_sha256} miniconda.sh" > anaconda.sha256 && \
sha256sum --strict -c anaconda.sha256 && \
bash miniconda.sh -b -p /opt/conda && \
export PATH=/opt/conda/bin:$PATH && \
conda config --set always_yes yes --set changeps1 no && \
conda info -a && \
conda install mamba -c conda-forge && \
mamba env update -f /env_python_3_with_R.yml --prune && \
# Cleanup
rm -v miniconda.sh anaconda.sha256 && \
# Cleanup based on https://github.com/ContinuumIO/docker-images/commit/cac3352bf21a26fa0b97925b578fb24a0fe8c383
find /opt/conda/ -follow -type f -name '*.a' -delete && \
find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
mamba clean -ay
# Allow to modify conda packages. This allows malicious code to be injected into other interpreter sessions, therefore it is disabled by default
# chmod -R ug+rwX /opt/conda
ENV PATH /opt/conda/envs/python_3_with_R/bin:/opt/conda/bin:$PATH
# 제플린 다운로드 및 설치
## 제플린의 바이너리를 다운로드하여 설치
## tar 명령을 통해 압축을 풀고, 필요한 디렉토리를 생성
## chmod 및 chown 명령을 사용하여 디렉토리와 파일의 권한을 설정
## 이는 컨테이너 내에서 제플린이 정상적으로 동작하도록 하기 위한 조치
RUN echo "$LOG_TAG Download Zeppelin binary" && \
mkdir -p ${ZEPPELIN_HOME} && \
wget -nv -O /tmp/zeppelin-${Z_VERSION}-bin-all.tgz https://archive.apache.org/dist/zeppelin/zeppelin-${Z_VERSION}/zeppelin-${Z_VERSION}-bin-all.tgz && \
tar --strip-components=1 -zxvf /tmp/zeppelin-${Z_VERSION}-bin-all.tgz -C ${ZEPPELIN_HOME} && \
rm -f /tmp/zeppelin-${Z_VERSION}-bin-all.tgz && \
chown -R root:root ${ZEPPELIN_HOME} && \
mkdir -p ${ZEPPELIN_HOME}/logs ${ZEPPELIN_HOME}/run ${ZEPPELIN_HOME}/webapps && \
# Allow process to edit /etc/passwd, to create a user entry for zeppelin
chgrp root /etc/passwd && chmod ug+rw /etc/passwd && \
# Give access to some specific folders
chmod -R 775 "${ZEPPELIN_HOME}/logs" "${ZEPPELIN_HOME}/run" "${ZEPPELIN_HOME}/notebook" "${ZEPPELIN_HOME}/conf" && \
# Allow process to create new folders (e.g. webapps)
chmod 775 ${ZEPPELIN_HOME} && \
chmod -R 775 /opt/conda
# 로그 설정 파일 복사
## 제플린의 로그 설정 파일을 컨테이너의 설정 디렉토리로 복사
## 이는 제플린의 로그 관리 및 설정을 위한 파일들
COPY log4j.properties ${ZEPPELIN_HOME}/conf/
COPY log4j_docker.properties ${ZEPPELIN_HOME}/conf/
COPY log4j2.properties ${ZEPPELIN_HOME}/conf/
COPY log4j2_docker.properties ${ZEPPELIN_HOME}/conf/
# 사용자 및 권한 설정
## 컨테이너 내에서 UID 1000을 사용하는 일반 사용자로 실행되도록 설정
## 이는 보안상의 이유로 루트 사용자 대신 비루트 사용자로 애플리케이션을 실행하기 위한 조치
USER 1000
# 포트 노출 및 실행 명령 설정
## 제플린의 웹 인터페이스가 사용하는 8080 포트를 외부에 노출
## ENTRYPOINT는 도커 컨테이너가 시작될 때 실행되는 명령어를 지정
## 여기서는 tini를 사용하여 컨테이너 내에서 안정적으로 프로세스를 관리
## WORKDIR는 기본 작업 디렉토리를 설정
## CMD는 제플린 서버를 시작하는 스크립트를 실행
EXPOSE 8080
ENTRYPOINT [ "/usr/bin/tini", "--" ]
WORKDIR ${ZEPPELIN_HOME}
CMD ["bin/zeppelin.sh"]
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] zsh: command not found: docker-compose (0) | 2024.08.17 |
---|---|
[Zeppelin] Apache Thrift (0) | 2024.08.16 |
[Zeppelin] 아파치 제플린이란 (0) | 2024.08.16 |
[Zeppelin] 로그_20240729 (0) | 2024.07.29 |
[Zeppelin] 코드분석_20240726 (0) | 2024.07.26 |