From 111a3a2a8d7922199f59fd6a8457b90926e8c318 Mon Sep 17 00:00:00 2001 From: Junyoung Im Date: Wed, 28 Jan 2026 00:07:35 +0900 Subject: [PATCH 1/8] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ca68345..f602cb2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ | 이미지 태그 (Image Tag) | TensorFlow 버전 | CUDA / cuDNN | 베이스 OS (Base OS) | 주요 변경사항 및 설명 | | :--- | :--- | :--- | :--- | :--- | -| `dguailab/decs:latest`
`dguailab/decs:251002` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** TensorFlow 2.18.0 업그레이드, 최신 GPU 환경 지원 | +| `dguailab/decs:latest`
`dguailab/decs:251023` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** Jupyter Notebook 버전 변경으로 인한 오류 해결 버전 | +| `dguailab/decs:251002` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(이전 안정 버전)** TensorFlow 2.18.0 업그레이드, 최신 GPU 환경 지원 | | `dguailab/decs:250926` | **2.13.0** | CUDA 11.8
cuDNN 8.6 | Ubuntu 20.04 | **(이전 안정 버전)** TensorFlow 2.13.0 기반의 안정화 버전 | ## ⚙️ 사용 방법 From 57552ddbc46bf23f5050bbab3519754cb1805809 Mon Sep 17 00:00:00 2001 From: gyeome06 Date: Sun, 1 Feb 2026 01:40:45 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[fix]=20#24=20=EC=9D=98=EB=8F=84=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20MOTD=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entrypoint.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index cb2113d..3bf93b3 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -64,6 +64,9 @@ resulting from failing to check and respond within 24 hours of a Slack notice. \e[0m" EOF +# 의도되지 않은 MOTD 출력 방지 +sed -i.bak '/^[[:space:]]*else[[:space:]]*$/,/^[[:space:]]*EXPL[[:space:]]*$/d' /etc/bash.bashrc + for file in /etc/update-motd.d/60-unminimize /etc/update-motd.d/10-help-text; do if [[ -f "$file" ]]; then sed -i '/^[^#]/ s/^/#/' "$file" From 61ec4e518d3a50d7f9f64a83ad36ba9c261980ea Mon Sep 17 00:00:00 2001 From: uugaemi Date: Wed, 18 Mar 2026 12:13:14 +0900 Subject: [PATCH 3/8] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f602cb2..e189b75 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,9 @@ | 이미지 태그 (Image Tag) | TensorFlow 버전 | CUDA / cuDNN | 베이스 OS (Base OS) | 주요 변경사항 및 설명 | | :--- | :--- | :--- | :--- | :--- | -| `dguailab/decs:latest`
`dguailab/decs:251023` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** Jupyter Notebook 버전 변경으로 인한 오류 해결 버전 | -| `dguailab/decs:251002` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(이전 안정 버전)** TensorFlow 2.18.0 업그레이드, 최신 GPU 환경 지원 | +| `dguailab/decs:latest`
`dguailab/decs:260201` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** 의도되지 않은 MOTD 출력 방지 버그 수정 | +| `dguailab/decs:251023` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(이전 안정 버전)** Jupyter Notebook 버전 변경으로 인한 오류 해결 버전 | +| `dguailab/decs:251002` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | TensorFlow 2.18.0 업그레이드, 최신 GPU 환경 지원 | | `dguailab/decs:250926` | **2.13.0** | CUDA 11.8
cuDNN 8.6 | Ubuntu 20.04 | **(이전 안정 버전)** TensorFlow 2.13.0 기반의 안정화 버전 | ## ⚙️ 사용 방법 From c96b1271424fa3eabd5738c4e0cc26b16cb77c3e Mon Sep 17 00:00:00 2001 From: dongmin0204 Date: Fri, 3 Apr 2026 03:24:32 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20gosu=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 9b09888..a413172 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,6 +23,7 @@ RUN apt-get clean \ && apt-get -y update \ && apt install -y \ sudo \ +gosu \ net-tools \ fcitx-hangul \ fonts-nanum* \ From 296d5b74ad96d9e739dd38dae1d7394fb57ced01 Mon Sep 17 00:00:00 2001 From: dongmin0204 Date: Fri, 3 Apr 2026 03:25:27 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20Jupyter=EC=99=80=20=EC=BB=A8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=84=88=20=EC=9C=A0=EC=A7=80=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=84=B8=EC=8A=A4=EB=A5=BC=20=EB=B9=84-root=EB=A1=9C?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entrypoint.sh | 99 +++++++++++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 46 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 3bf93b3..63ffdd6 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,28 +1,45 @@ #!/bin/bash +set -euo pipefail -sudo apt update -sudo apt install -y auditd +: "${USER_ID:?USER_ID is required}" +: "${USER_PW:?USER_PW is required}" +: "${TARGET_UID:?TARGET_UID is required}" + +USER_GROUP="${USER_GROUP:-$USER_ID}" +TARGET_GID="${TARGET_GID:-$TARGET_UID}" +USER_HOME="/home/$USER_ID" +JUPYTER_DIR="$USER_HOME/decs_jupyter_lab" +JUPYTER_CONFIG_DIR="$USER_HOME/.jupyter" +JUPYTER_CONFIG_FILE="$JUPYTER_CONFIG_DIR/jupyter_notebook_config.py" + +apt-get update +apt-get install -y auditd # /etc/audit/audit.rules 파일에 줄 추가 -echo "-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid=$USER_ID -k rm_commands" >> /etc/audit/audit.rules +echo "-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid=$TARGET_UID -k rm_commands" >> /etc/audit/audit.rules # history 명령어 칠 때 명령어를 입력한 시간이 같이 나오게 하는 명령어 echo 'HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "' >> /etc/profile echo 'export HISTTIMEFORMAT' >> /etc/profile +# 그룹과 사용자를 먼저 준비한다. +if ! getent group "$USER_GROUP" >/dev/null 2>&1; then + groupadd -g "$TARGET_GID" "$USER_GROUP" +fi + if ! id "$USER_ID" >/dev/null 2>&1; then - # 유저 디렉토리 존재하지 않는 경우, 디렉토리와 skel 생성 - if [ ! -d "/home/$USER_ID/" ]; then - cp -R /etc/skel/. "/home/$USER_ID" - chmod -R 700 "/home/$USER_ID" # 초기 권한 설정 후 아래에서 변경 - + if [ ! -d "$USER_HOME" ]; then + cp -R /etc/skel/. "$USER_HOME" + chmod -R 700 "$USER_HOME" + # history -w 현재시간.txt파일을 만들고, /var/log/audit로 이동하는 부분임. 사용자가 로그아웃 할 때 - echo 'cd ~' >> /home/$USER_ID/.bash_logout - echo 'current_time=$(date +%Y-%m-%d_%H-%M-%S)' >> /home/$USER_ID/.bash_logout - echo 'history -w $current_time.txt' >> /home/$USER_ID/.bash_logout - echo 'sudo mv $current_time.txt /var/log/audit/' >> /home/$USER_ID/.bash_logout + echo 'cd ~' >> "$USER_HOME/.bash_logout" + echo 'current_time=$(date +%Y-%m-%d_%H-%M-%S)' >> "$USER_HOME/.bash_logout" + echo 'history -w $current_time.txt' >> "$USER_HOME/.bash_logout" + echo 'sudo mv $current_time.txt /var/log/audit/' >> "$USER_HOME/.bash_logout" fi - useradd -s /bin/bash -d /home/$USER_ID -u $UID $USER_ID + + useradd -s /bin/bash -d "$USER_HOME" -u "$TARGET_UID" -g "$USER_GROUP" "$USER_ID" # sudo 권한 제공 echo "$USER_ID ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers @@ -34,18 +51,16 @@ if ! id "$USER_ID" >/dev/null 2>&1; then sed -i "/^#PermitRootLogin/a AllowUsers svmanager" /etc/ssh/sshd_config sed -i "/^#PermitRootLogin/a AllowUsers $USER_ID" /etc/ssh/sshd_config sed -i 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config +else + usermod -u "$TARGET_UID" "$USER_ID" || true + usermod -g "$USER_GROUP" "$USER_ID" fi -# 그룹이 존재하지 않을 경우 생성하고 사용자를 그룹에 추가 -if ! getent group "$USER_GROUP" >/dev/null 2>&1; then - groupadd -g $GID "$USER_GROUP" -fi usermod -aG "$USER_GROUP" "$USER_ID" # 사용자와 그룹이 모두 준비된 후, 소유권과 권한을 설정합니다. -chown -R "$USER_ID:$USER_GROUP" "/home/$USER_ID" -chmod 750 "/home/$USER_ID" - +chown -R "$USER_ID:$USER_GROUP" "$USER_HOME" +chmod 750 "$USER_HOME" # MOTD 공지 출력하도록 설정 sed -i 's/^#\?UsePAM .*/UsePAM yes/' /etc/ssh/sshd_config @@ -82,40 +97,32 @@ fi service ssh restart # jupyter lab 에서 생성한 ipynb 파일을 저장할 디렉토리 생성 (없는경우만 신규 생성) -if [ ! -d "/home/$USER_ID/decs_jupyter_lab" ]; then - mkdir /home/$USER_ID/decs_jupyter_lab - echo "Created /home/$USER_ID/decs_jupyter_lab dir...." -fi - -# jupyter lab config 파일이 없으면 생성 -mkdir -p /home/$USER_ID/.jupyter/ +mkdir -p "$JUPYTER_DIR" "$JUPYTER_CONFIG_DIR" +chown -R "$USER_ID:$USER_GROUP" "$JUPYTER_DIR" "$JUPYTER_CONFIG_DIR" -if [ ! -f /home/$USER_ID/.jupyter/jupyter_notebook_config.py ]; then - echo "jupyter_notebook_config.py not found, generating..." - /opt/anaconda3/bin/jupyter notebook --generate-config - cp /root/.jupyter/jupyter_notebook_config.py /home/$USER_ID/.jupyter/ +if [ ! -f "$JUPYTER_CONFIG_FILE" ]; then + echo "jupyter_notebook_config.py not found, generating..." + gosu "$USER_ID:$USER_GROUP" /opt/anaconda3/bin/jupyter notebook --generate-config --config="$JUPYTER_CONFIG_FILE" else - echo "jupyter_notebook_config.py already exists." + echo "jupyter_notebook_config.py already exists." fi # jupyter lab 접속 설정 -sed -i "1i c.JupyterApp.config_file_name = 'jupyter_notebook_config.py'\nc.NotebookApp.allow_origin = '*'\nc.NotebookApp.ip = '0.0.0.0'\nc.NotebookApp.open_browser = False\nc.NotebookApp.allow_remote_access = True\nc.NotebookApp.allow_root = True\nc.NotebookApp.notebook_dir='/home/$USER_ID/decs_jupyter_lab'" /home/$USER_ID/.jupyter/jupyter_notebook_config.py - -# Jupyter Lab 토큰을 랜덤 문자열로 생성하고 저장 -TOKEN=$(tr -dc A-Za-z0-9 /home/$USER_ID/decs_jupyter_lab/jupyter_token.txt -chmod 600 /home/$USER_ID/decs_jupyter_lab/jupyter_token.txt -chown $USER_ID:$USER_ID /home/$USER_ID/decs_jupyter_lab/jupyter_token.txt - -# jupyter_lab 기동 -echo "trying jupyter lab..." -nohup /opt/anaconda3/bin/jupyter lab --NotebookApp.token=$TOKEN --config=/home/$USER_ID/.jupyter/jupyter_notebook_config.py >/dev/null 2>&1 & -echo "jupyter lab listening!" +sed -i "1i c.JupyterApp.config_file_name = 'jupyter_notebook_config.py'\nc.NotebookApp.allow_origin = '*'\nc.NotebookApp.ip = '0.0.0.0'\nc.NotebookApp.open_browser = False\nc.NotebookApp.allow_remote_access = True\nc.NotebookApp.allow_root = False\nc.NotebookApp.notebook_dir='$JUPYTER_DIR'" "$JUPYTER_CONFIG_FILE" +chown "$USER_ID:$USER_GROUP" "$JUPYTER_CONFIG_FILE" # ldconfig permission 오류 방지 # bash.bashrc에서 ldconfig 명령어 삭제 후 명령어 실행 및 결과 출력 sed -i '/ldconfig/d' /etc/bash.bashrc ldconfig && echo "ldconfig executed successfully" || echo "ldconfig failed" -#entrypoint.sh 를 실행하고 나서 컨테이너가 Exit 하지 않게함 -tail -F /dev/null +# Jupyter 실행과 컨테이너 유지는 비-root 사용자로 전환한다. +exec gosu "$USER_ID:$USER_GROUP" bash -lc ' +TOKEN=$(tr -dc A-Za-z0-9 "'"$JUPYTER_DIR"'/jupyter_token.txt" +chmod 600 "'"$JUPYTER_DIR"'/jupyter_token.txt" +echo "trying jupyter lab..." +nohup /opt/anaconda3/bin/jupyter lab --NotebookApp.token="$TOKEN" --config="'"$JUPYTER_CONFIG_FILE"'" >/dev/null 2>&1 & +echo "jupyter lab listening!" +exec tail -F /dev/null +' From e2e84424f3ab16c5aa02fdf428a8a81f4a181201 Mon Sep 17 00:00:00 2001 From: dongmin0204 Date: Fri, 3 Apr 2026 03:42:56 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20config-server=EC=A3=BC=EC=9E=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20sudo=20=EA=B6=8C=ED=95=9C=20=EC=B6=95?= =?UTF-8?q?=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entrypoint.sh | 97 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 63ffdd6..3fe5431 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,7 +2,6 @@ set -euo pipefail : "${USER_ID:?USER_ID is required}" -: "${USER_PW:?USER_PW is required}" : "${TARGET_UID:?TARGET_UID is required}" USER_GROUP="${USER_GROUP:-$USER_ID}" @@ -12,58 +11,78 @@ JUPYTER_DIR="$USER_HOME/decs_jupyter_lab" JUPYTER_CONFIG_DIR="$USER_HOME/.jupyter" JUPYTER_CONFIG_FILE="$JUPYTER_CONFIG_DIR/jupyter_notebook_config.py" -apt-get update -apt-get install -y auditd +ensure_account_matches_mounts() { + local passwd_entry + local group_entry + local actual_uid + local actual_gid + local actual_home + local actual_group_gid + + passwd_entry="$(getent passwd "$USER_ID" || true)" + if [[ -z "$passwd_entry" ]]; then + echo "[ERROR] User '$USER_ID' not found in mounted /etc/passwd" >&2 + exit 1 + fi -# /etc/audit/audit.rules 파일에 줄 추가 -echo "-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid=$TARGET_UID -k rm_commands" >> /etc/audit/audit.rules + IFS=: read -r _ _ actual_uid actual_gid _ actual_home _ <<<"$passwd_entry" -# history 명령어 칠 때 명령어를 입력한 시간이 같이 나오게 하는 명령어 -echo 'HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "' >> /etc/profile -echo 'export HISTTIMEFORMAT' >> /etc/profile + if [[ "$actual_uid" != "$TARGET_UID" ]]; then + echo "[ERROR] USER_ID '$USER_ID' has uid '$actual_uid', expected '$TARGET_UID'" >&2 + exit 1 + fi -# 그룹과 사용자를 먼저 준비한다. -if ! getent group "$USER_GROUP" >/dev/null 2>&1; then - groupadd -g "$TARGET_GID" "$USER_GROUP" -fi + if [[ "$actual_gid" != "$TARGET_GID" ]]; then + echo "[ERROR] USER_ID '$USER_ID' has gid '$actual_gid', expected '$TARGET_GID'" >&2 + exit 1 + fi + + if [[ "$actual_home" != "$USER_HOME" ]]; then + echo "[ERROR] USER_ID '$USER_ID' has home '$actual_home', expected '$USER_HOME'" >&2 + exit 1 + fi -if ! id "$USER_ID" >/dev/null 2>&1; then - if [ ! -d "$USER_HOME" ]; then - cp -R /etc/skel/. "$USER_HOME" - chmod -R 700 "$USER_HOME" + group_entry="$(getent group "$USER_GROUP" || true)" + if [[ -z "$group_entry" ]]; then + echo "[ERROR] Group '$USER_GROUP' not found in mounted /etc/group" >&2 + exit 1 + fi - # history -w 현재시간.txt파일을 만들고, /var/log/audit로 이동하는 부분임. 사용자가 로그아웃 할 때 - echo 'cd ~' >> "$USER_HOME/.bash_logout" - echo 'current_time=$(date +%Y-%m-%d_%H-%M-%S)' >> "$USER_HOME/.bash_logout" - echo 'history -w $current_time.txt' >> "$USER_HOME/.bash_logout" - echo 'sudo mv $current_time.txt /var/log/audit/' >> "$USER_HOME/.bash_logout" + IFS=: read -r _ _ actual_group_gid _ <<<"$group_entry" + if [[ "$actual_group_gid" != "$TARGET_GID" ]]; then + echo "[ERROR] USER_GROUP '$USER_GROUP' has gid '$actual_group_gid', expected '$TARGET_GID'" >&2 + exit 1 fi +} - useradd -s /bin/bash -d "$USER_HOME" -u "$TARGET_UID" -g "$USER_GROUP" "$USER_ID" +ensure_sshd_allow_user() { + local user_name="$1" + if ! grep -qxF "AllowUsers $user_name" /etc/ssh/sshd_config; then + printf '\nAllowUsers %s\n' "$user_name" >> /etc/ssh/sshd_config + fi +} - # sudo 권한 제공 - echo "$USER_ID ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers +apt-get update +apt-get install -y auditd - # 비밀번호 설정 - echo "$USER_ID:$USER_PW" | chpasswd +# /etc/audit/audit.rules 파일에 줄 추가 +echo "-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid=$TARGET_UID -k rm_commands" >> /etc/audit/audit.rules - # 서버관리자와 유저계정의 ssh 접속을 허용 및 다중접속 허용 - sed -i "/^#PermitRootLogin/a AllowUsers svmanager" /etc/ssh/sshd_config - sed -i "/^#PermitRootLogin/a AllowUsers $USER_ID" /etc/ssh/sshd_config - sed -i 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config -else - usermod -u "$TARGET_UID" "$USER_ID" || true - usermod -g "$USER_GROUP" "$USER_ID" -fi +# history 명령어 칠 때 명령어를 입력한 시간이 같이 나오게 하는 명령어 +echo 'HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "' >> /etc/profile +echo 'export HISTTIMEFORMAT' >> /etc/profile -usermod -aG "$USER_GROUP" "$USER_ID" +ensure_account_matches_mounts -# 사용자와 그룹이 모두 준비된 후, 소유권과 권한을 설정합니다. -chown -R "$USER_ID:$USER_GROUP" "$USER_HOME" +# admin_infra가 주입한 account files를 기준으로, writable path만 준비한다. +mkdir -p "$USER_HOME" +chown "$TARGET_UID:$TARGET_GID" "$USER_HOME" chmod 750 "$USER_HOME" # MOTD 공지 출력하도록 설정 sed -i 's/^#\?UsePAM .*/UsePAM yes/' /etc/ssh/sshd_config +ensure_sshd_allow_user "svmanager" +ensure_sshd_allow_user "$USER_ID" cat < /etc/default/motd-news ENABLED=1 echo "\e[0;33m @@ -98,7 +117,7 @@ service ssh restart # jupyter lab 에서 생성한 ipynb 파일을 저장할 디렉토리 생성 (없는경우만 신규 생성) mkdir -p "$JUPYTER_DIR" "$JUPYTER_CONFIG_DIR" -chown -R "$USER_ID:$USER_GROUP" "$JUPYTER_DIR" "$JUPYTER_CONFIG_DIR" +chown -R "$TARGET_UID:$TARGET_GID" "$JUPYTER_DIR" "$JUPYTER_CONFIG_DIR" if [ ! -f "$JUPYTER_CONFIG_FILE" ]; then echo "jupyter_notebook_config.py not found, generating..." @@ -109,7 +128,7 @@ fi # jupyter lab 접속 설정 sed -i "1i c.JupyterApp.config_file_name = 'jupyter_notebook_config.py'\nc.NotebookApp.allow_origin = '*'\nc.NotebookApp.ip = '0.0.0.0'\nc.NotebookApp.open_browser = False\nc.NotebookApp.allow_remote_access = True\nc.NotebookApp.allow_root = False\nc.NotebookApp.notebook_dir='$JUPYTER_DIR'" "$JUPYTER_CONFIG_FILE" -chown "$USER_ID:$USER_GROUP" "$JUPYTER_CONFIG_FILE" +chown "$TARGET_UID:$TARGET_GID" "$JUPYTER_CONFIG_FILE" # ldconfig permission 오류 방지 # bash.bashrc에서 ldconfig 명령어 삭제 후 명령어 실행 및 결과 출력 From 443aaaebdcf4115cdb6efc5fd6f47d233e86cc6f Mon Sep 17 00:00:00 2001 From: dongmin0204 Date: Fri, 3 Apr 2026 03:46:06 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20=EA=B3=84=EC=A0=95=20=EB=B3=B4?= =?UTF-8?q?=ED=98=B8=20=EC=A0=95=EC=B1=85=20=EA=B0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entrypoint.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/entrypoint.sh b/entrypoint.sh index 3fe5431..77b3d5c 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -57,6 +57,10 @@ ensure_account_matches_mounts() { ensure_sshd_allow_user() { local user_name="$1" + if ! getent passwd "$user_name" >/dev/null 2>&1; then + echo "[WARN] Skipping AllowUsers for missing account '$user_name'" >&2 + return 0 + fi if ! grep -qxF "AllowUsers $user_name" /etc/ssh/sshd_config; then printf '\nAllowUsers %s\n' "$user_name" >> /etc/ssh/sshd_config fi From 2a45f605ea210cac825d869c4fefe38fa2161af6 Mon Sep 17 00:00:00 2001 From: dongmin0204 Date: Fri, 3 Apr 2026 04:03:56 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20260403=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e189b75..af75160 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ | 이미지 태그 (Image Tag) | TensorFlow 버전 | CUDA / cuDNN | 베이스 OS (Base OS) | 주요 변경사항 및 설명 | | :--- | :--- | :--- | :--- | :--- | -| `dguailab/decs:latest`
`dguailab/decs:260201` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** 의도되지 않은 MOTD 출력 방지 버그 수정 | +| `dguailab/decs:latest`
`dguailab/decs:260403` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(최신)** 계정/권한 검증 강화, Jupyter 비-root 실행, 의도되지 않은 MOTD 출력 방지 | +| `dguailab/decs:260201` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(이전 수정 버전)** 의도되지 않은 MOTD 출력 방지 버그 수정 | | `dguailab/decs:251023` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | **(이전 안정 버전)** Jupyter Notebook 버전 변경으로 인한 오류 해결 버전 | | `dguailab/decs:251002` | **2.18.0** | CUDA 12.5
cuDNN 8.9 | Ubuntu 22.04 | TensorFlow 2.18.0 업그레이드, 최신 GPU 환경 지원 | | `dguailab/decs:250926` | **2.13.0** | CUDA 11.8
cuDNN 8.6 | Ubuntu 20.04 | **(이전 안정 버전)** TensorFlow 2.13.0 기반의 안정화 버전 |