Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.git
.github
README.md
image-variants.json
scripts
tests
75 changes: 61 additions & 14 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,59 @@ name: CI/CD - Docker Image from DECS Branch
on:
pull_request:
types: [closed]
branches: [ "develop" ]
branches: [ "main" ]
workflow_dispatch:
inputs:
date_tag:
description: "YYMMDD release tag. Defaults to image-variants.json."
required: false
type: string

jobs:
prepare:
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true
runs-on: ubuntu-latest
outputs:
tag_name: ${{ steps.generate_tag.outputs.TAG_NAME }}
matrix: ${{ steps.generate_matrix.outputs.matrix }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Generate release tag
id: generate_tag
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ inputs.date_tag }}" ]]; then
TAG_VERSION="${{ inputs.date_tag }}"
elif [[ -n "${{ github.event.pull_request.head.ref }}" ]]; then
BRANCH_NAME="${{ github.event.pull_request.head.ref }}"
TAG_VERSION="${BRANCH_NAME#decs}"
else
TAG_VERSION="$(python3 -c 'import json; print(json.load(open("image-variants.json", encoding="utf-8"))["default_date_tag"])')"
fi

if ! [[ "$TAG_VERSION" =~ ^[0-9]{6}$ ]]; then
echo "Release tag must be YYMMDD, got: $TAG_VERSION" >&2
exit 1
fi

echo "TAG_NAME=$TAG_VERSION" >> "$GITHUB_OUTPUT"

- name: Generate build matrix
id: generate_matrix
run: |
python3 scripts/variant_matrix.py \
--date-tag "${{ steps.generate_tag.outputs.TAG_NAME }}" \
--repository dguailab/decs \
--github-output

build-and-push:
if: github.event.pull_request.merged == true
needs: prepare
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}

steps:
- name: Checkout repository
Expand All @@ -20,19 +67,19 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Generate tag from branch name
id: generate_tag
run: |
BRANCH_NAME=${{ github.event.pull_request.head.ref }}
TAG_VERSION=${BRANCH_NAME#decs}
echo "Extracted tag version: $TAG_VERSION"
echo "TAG_NAME=$TAG_VERSION" >> $GITHUB_OUTPUT

- name: Build and push Docker image
- name: Build and push ${{ matrix.id }}
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: |
dguailab/decs:${{ steps.generate_tag.outputs.TAG_NAME }}
dguailab/decs:latest
build-args: |
BASE_IMAGE=${{ matrix.base_image }}
DECS_IMAGE_VARIANT=${{ matrix.id }}
CUDA_VERSION=${{ matrix.cuda_version }}
TENSORFLOW_VERSION=${{ matrix.tensorflow_version }}
TENSORFLOW_PACKAGE=${{ matrix.tensorflow_package }}
PYTHON_VERSION=${{ matrix.python_version }}
UBUNTU_VERSION=${{ matrix.ubuntu_version }}
MIN_NVIDIA_DRIVER=${{ matrix.min_nvidia_driver }}
tags: ${{ matrix.docker_tags }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__pycache__/
*.py[cod]
179 changes: 105 additions & 74 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,83 +1,114 @@
# 이 파일은 decs:251002 이미지의 Dockerfile 입니다.
############################# version history #############################

##### decs:251002#####
# 변경한 사람: 이소은
# tensorflow version 2.13.0-gpu -> 2.18.0-gpu

########################### version history end ##########################

# TensorFlow 2.18.0 GPU 공식 이미지 사용 (CUDA 12.3, cuDNN 8.9 포함, Ubuntu 22.04 기반)
# https://hub.docker.com/layers/tensorflow/tensorflow/2.18.0-gpu/images/sha256-b076938b81335b8098a58a9e701ea183a652f146419f8601550c000f576e3cc4
FROM tensorflow/tensorflow:2.18.0-gpu

# 설치 시 geographic area 를 물어보지 않도록 설정(apt install 시 interrupted 됨)
ENV DEBIAN_FRONTEND noninteractive

ENV SUDOER_ID svmanager
ENV SUDOER_PW decs2260
ENV SUDOER_DIR /$SUDOER_ID
ENV SSHD_CONFIG_PATH /etc/ssh/sshd_config
# DECS CUDA/TensorFlow image template.
# Build variants are defined in image-variants.json and passed as build args.

ARG BASE_IMAGE=nvidia/cuda:12.5.1-cudnn-devel-ubuntu22.04
FROM ${BASE_IMAGE}

ARG BASE_IMAGE
ARG DECS_IMAGE_VARIANT=cuda12.5-tf2.20-ubuntu22.04
ARG CUDA_VERSION=12.5
ARG TENSORFLOW_VERSION=2.20.0
ARG TENSORFLOW_PACKAGE=tensorflow==2.20.0
ARG PYTHON_VERSION=3.10
ARG UBUNTU_VERSION=22.04
ARG MIN_NVIDIA_DRIVER=555.42.06
ARG MINIFORGE_VERSION=25.3.1-0

LABEL org.opencontainers.image.base.name="${BASE_IMAGE}" \
ai.dgu.decs.variant="${DECS_IMAGE_VARIANT}" \
ai.dgu.decs.cuda="${CUDA_VERSION}" \
ai.dgu.decs.tensorflow="${TENSORFLOW_VERSION}" \
ai.dgu.decs.python="${PYTHON_VERSION}" \
ai.dgu.decs.ubuntu="${UBUNTU_VERSION}" \
ai.dgu.decs.min_nvidia_driver="${MIN_NVIDIA_DRIVER}"

ENV DEBIAN_FRONTEND=noninteractive \
CONDA_DIR=/opt/conda \
DECS_IMAGE_VARIANT="${DECS_IMAGE_VARIANT}" \
DECS_CUDA_VERSION="${CUDA_VERSION}" \
DECS_TENSORFLOW_VERSION="${TENSORFLOW_VERSION}" \
DECS_PYTHON_VERSION="${PYTHON_VERSION}" \
DECS_MIN_NVIDIA_DRIVER="${MIN_NVIDIA_DRIVER}" \
SUDOER_ID=svmanager \
SUDOER_PW=decs2260 \
SUDOER_DIR=/svmanager \
SSHD_CONFIG_PATH=/etc/ssh/sshd_config

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN apt-get clean \
&& apt-get -y update \
&& apt install -y \
sudo \
net-tools \
fcitx-hangul \
fonts-nanum* \
vim \
wget \
curl \
ssh \
software-properties-common

# motd install
RUN apt-get update && apt-get install -y update-motd


# 관리자 계정의 home directory 로 쓸 폴더 추가(home은 nfs이므로, 다른 곳에 생성)
RUN mkdir "$SUDOER_DIR"
# 관리자 계정을 추가, home directory 를 위에서 생성한 폴더로 설정
RUN useradd -s /bin/bash -d /$SUDOER_ID -G sudo $SUDOER_ID \
&& echo "$SUDOER_ID ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# skel 을 복사 (로그인 시 tf-docker 로 뜨지 않게 하는 목적)
RUN cp -R /etc/skel/. "$SUDOER_DIR"

RUN echo $SUDOER_ID:$SUDOER_PW | chpasswd


# decs dir 을 생성
RUN mkdir /home/decs
&& apt-get update \
&& apt-get install -y --no-install-recommends \
auditd \
ca-certificates \
curl \
dbus-x11 \
fcitx-hangul \
fonts-nanum \
fonts-nanum-coding \
fonts-nanum-extra \
gnupg \
net-tools \
novnc \
openssh-server \
software-properties-common \
sudo \
tigervnc-common \
tigervnc-standalone-server \
update-motd \
vim \
websockify \
wget \
xfce4 \
xfce4-terminal \
&& rm -rf /var/lib/apt/lists/*

RUN mkdir -p "$SUDOER_DIR" /home/decs /run/sshd \
&& useradd -s /bin/bash -d "$SUDOER_DIR" -G sudo "$SUDOER_ID" \
&& echo "$SUDOER_ID ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
&& cp -R /etc/skel/. "$SUDOER_DIR" \
&& echo "$SUDOER_ID:$SUDOER_PW" | chpasswd

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update && apt-get install -y google-chrome-stable

RUN printf "LANG=\"ko_KR.UTF-8\"\nLANG=\"ko_KR.EUC-KR\"\nLANGUAGE=\"ko_KR:ko:en_GB:en\"\n" >> /etc/environment \
&& fc-cache -r

RUN cat /etc/environment

# 최신 Anaconda 버전 다운로드 및 설치
RUN wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh \
&& bash Anaconda3-2024.10-1-Linux-x86_64.sh -b -p /opt/anaconda3 \
&& rm Anaconda3-2024.10-1-Linux-x86_64.sh
&& echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends google-chrome-stable \
&& rm -rf /var/lib/apt/lists/*

RUN printf 'LANG="ko_KR.UTF-8"\nLANGUAGE="ko_KR:ko:en_GB:en"\n' >> /etc/environment \
&& fc-cache -r

RUN wget -q "https://github.com/conda-forge/miniforge/releases/download/${MINIFORGE_VERSION}/Miniforge3-Linux-x86_64.sh" \
&& bash Miniforge3-Linux-x86_64.sh -b -p "$CONDA_DIR" \
&& rm Miniforge3-Linux-x86_64.sh

ENV PATH=/opt/conda/bin:$PATH

RUN conda config --system --set channel_priority strict \
&& conda config --system --add channels conda-forge \
&& conda install -n base -y \
"python=${PYTHON_VERSION}" \
ipywidgets \
jupyterlab \
micromamba \
notebook \
pip \
&& python -m pip install --no-cache-dir --upgrade pip \
&& python -m pip install --no-cache-dir "${TENSORFLOW_PACKAGE}" \
&& conda clean -afy \
&& conda init bash

RUN apt-get update \
&& apt-get install -y --no-install-recommends tigervnc-tools \
&& rm -rf /var/lib/apt/lists/*
Comment on lines +101 to +103

RUN mkdir -p /jupyter_config \
&& touch /jupyter_config/jupyter_notebook_config.py

ENV PATH /opt/anaconda3/bin:$PATH
RUN echo "export PATH="/opt/anaconda3/bin:$PATH"" >> /etc/profile \
&& /opt/anaconda3/bin/conda init

# jupyterlab 설치
RUN /opt/anaconda3/bin/conda install -y jupyterlab

# jupyterlab 설정파일 생성
RUN mkdir /jupyter_config \
&& /opt/anaconda3/bin/jupyter lab --generate-config --config=/jupyter_config/jupyter_notebook_config.py

# entrypoint.sh 복사
COPY entrypoint.sh /

# SSHD 서버를 실행하고, entrypoint 파일을 start/restart 시 마다 실행, dev/null에 entrypoint 로그를 저장
# noVNC listens on 6080. The TigerVNC server binds to localhost only.
EXPOSE 6080

RUN chmod +x /entrypoint.sh
ENTRYPOINT ["bash", "/entrypoint.sh"]
Loading
Loading