심심한 개발자의 취미생활

4. 온라인 코딩 테스트 시스템 실행 Container 제작

Container 제작과 관리는 이 프로젝트의 핵심이라고 할 수 있다. 컨테이너 제작과 생성, 관리를 얼마나 잘 하느냐에 따라 사용자 경험이 달라 지기 때문이다. 언어별, 버전별, 상황별, 라이브러리별, 목적별 제작되는 컨테이너가 모두 다르고 생성 개수도 많이 때문에 컨테이너를 얼마나 잘 관리하는지 역시 중요하다.

Container 기본 형태

# 컨테이너 기본 구조
FROM 실행 언어 base 이미지

# 실행할 파일이 저장되어 있는 디렉토리 볼륨 마운트
VOLUME ["/exam"]

# 작업 위치 설정
WORKDIR /exam

# 환경 파일 실행 
ENTRYPOINT ["실행 환경"]
# CMD 명령러를 통한 실행 파일명 동적 설정
CMD ["test.lang"] 

# 이미지 생성 / 언어별 Dockerfile 사용
# docker build -t container_lang:latest -f Dockerfile_lang .

# 컨테이너 실행 / 공통 storage 연결을 위한 네트워크 설정과 volume 설정, 언어 실행 후 컨테이너 삭제
# docker run --rm --network net-onCoTe -v vol-onCoTe-storage:/exam container_lang:latest test.lang

C lang

# Dockerfile_c

# 베이스 이미지 설정
FROM gcc:12.4.0-bookworm

# 저장소 볼륨 설정
VOLUME ["/exam"]

# 작업 위치 설정
WORKDIR /exam

# gcc를 사용하여 컴파일을 진행 후 실행하는데 중간 오브젝트 파일이나 최종 실행 파일을 남기지 않기 위해 언어 실행 및 정리 작업을 shell script로 작성
ENTRYPOINT ["./run_c.sh"]
CMD ["clang.c"]


# 이미지 생성
# docker build -t container_c:latest -f Dockerfile_c .

# 컨테이너 실행
# docker run --rm --network net-onCoTe -v vol-onCoTe-storage:/exam container_c:latest 
# run_c.sh

#!/bin/sh

# 현재 시간을 활용하여 파일명이 겹치지 않도록 임시 파일명 
TIME=$(date +%s)

# 컴파일 / 실행 / 삭제
gcc "$1" -o "$TIME"  && ./"$TIME" && rm "$TIME"

java

# Dockerfile_java

# 베이스 이미지 설정
FROM openjdk:17-jdk-slim

# 저장소 볼륨 설정
VOLUME ["/exam"]

# 작업 위치 설정
WORKDIR /exam

ENTRYPOINT ["java"]
CMD ["java.java"]


# 이미지 생성
# docker build -t container_java:latest -f Dockerfile_java .

# 컨테이너 실행
# docker run --rm --network net-onCoTe -v vol-onCoTe-storage:/exam container_java:latest 

javascript

# Dockerfile_js

# 베이스 이미지 설정
FROM node:22-alpine

# 저장소 볼륨 설정
VOLUME ["/exam"]

# 작업 위치 설정
WORKDIR /exam

# COPY ./test.js .

ENTRYPOINT ["node"]
CMD ["javascript.js"]

# 이미지 생성
# docker build -t container_js:latest -f Dockerfile_js .

# 컨테이너 실행
# docker run --rm --network net-onCoTe -v vol-onCoTe-storage:/exam container_js:latest 

python

# Dockerfile_py

# 베이스 이미지 설정
FROM python:3.13.5-alpine

# 저장소 볼륨 설정
VOLUME ["/exam"]

# 작업 위치 설정
WORKDIR /exam

ENTRYPOINT ["python"]
CMD ["python.py"]

# 이미지 생성
# docker build -t container_py:latest -f Dockerfile_py .

# 컨테이너 실행
# docker run --rm --network net-onCoTe -v vol-onCoTe-storage:/exam container_py:latest 

sql

# 네트워크 환경의 독립적인 SQL 실행 컨테이너 제작중...

개선 및 버전 관리

  • 언어별 컴파일러 버전 관리를 위한 언어 버전별 베이스 이미지 수정
  • 커스텀 실행 환경 세팅을 위한 컨테이너 생성 중 library 설치 명령어 작성