IT/기초 지식

[Singularity] Singularity 이미지를 생성하는 방법(Docker hub/def file)

개발자 두더지 2021. 6. 16. 01:41
728x90

 Singularity에서 이용하는 sif파일은 Definition Files를 바탕으로 생성된다. 다시 Definition File은 Docker이나 Podman에서 사용하는 개념으로 설명하자면 Dockerfile, Containerfile에 해당된다. 

 sif파일을 생성하는 방법은 보통 두 가지가 있다. 

  • Docker Hub에서 이미지를 받아온다.
  • Definition File을 작성하여 Build한다.

 이번 포스팅을 통해 이 두 가지 방법에 대해 소개하고자 한다.

 

 

Docker Hub에서 이미지를 받아온다.


 Docker Hub에 등록되어 있는 이미지로 실행 환경을 만들 수 있다. 두 번째에 소개할 Definition File보다 간단하다.

 먼저, Docker Hub로부터 이미리를 pull한다.

$ singularity pull docker://이미지명

 pull하면 동시에 sif파일로 변환된다. 커맨드 실행이 끝나면 ls 커맨드로 sif파일이 존재하는지 확인 후, 원하는 singularity 커맨드로 실행시키면 된다. 실행에 대한 이야기는 뒤에서 간략하게 설명하겠다.

 

 

Definition File을 작성하여 Build한다.


 Definition File은 위에서 설명했듯, Docker File와 동일한 역할을 하는데, 각 문법을 비교하자면 다음과 같다. 다만 구체적인 Definition File 문법에 대해서는 여기서는 생략하고 공식 홈페이지에 잘 나와있으니 참고하길 바란다. 

Dockerfile Definition File 기능
FROM From 베이스 이미지를 지정한다.
RUN %post 패키지, 라이브러리 인스톨등, 커맨드를 실행한다.
COPY %files 파일을 컨테이너에 복사한다.
CMD %runscript 컨테이너 실행시에 커맨드를 실행한다.
ENV %enviroment 환경변수를 정의한다.
LABEL %labels 메타 데이터를 작성한다.

 Definition File에서는 From으로 베이스가 되는 이미지를 지정하지만, 어디로 부터 이미지를 취득하는가를 컴퓨터에게 알려 줄 필요가 있기 때문에, BootStrap에 그 출처를 기재할 필요가 있다.  Docker hub이면 docker, Singulrarity library에서 취득하는 경우 library로 작성한다.

참고로 Definition file의 확장자는 def이고, linux 기반의 환경에서 작성하는 경우 vi 커맨드로 vi에디터로 작성하면 된다.

$ vi 파일명.def

 Definition File은 다음과 같이 작성할 수 있다.

#library는 singularity의 라이브러리
#docker는 dockerhub
#library 혹은 docker만 기재
Bootstrap: library or docker
#From에서는 베이스가 되는 이미지를 지정
From: ubuntu:18.04

%post
    #apt
    apt update 
    apt -y upgrade
    apt -y install 설치할 라이브러리나 패키지 작성
    #pip
    pip install 설치할 라이브러리나 패키지 작성

#환경변수를 지정
%environment
    export LC_ALL=C
    
#누가 이 파일을 작성했는가 등 메타 데이터를 작성
%labels
    Author hogehoge
    Version v0.0.0

 작성이 끝나면 def 파일을 sif 파일로 변환할 필요가 있기 때문에, 아래의 커맨드를 사용한다.

$ singularity build 파일명.sif 파일명.def

 ls 커맨드로 확인해보면 작성한 def 파일과 변환한 sif 파일이 존재하고 있는 것을 알 수 있다.

$ ls
파일명.sif  파일명.def

 

 여담으로 build 할 때에 사용할 수 있는 옵션이 여러 가지가 있는데, 여기서는 --sandbox 옵션에 대해서 잠깐 설명하고자 한다.

 sif 파일은 기본적으로 읽기 전용으로 다뤄진다. 그러나 컨테이너 내부에서 패키지나 라이브러리를 설치하는 등의 조작을 하고 싶은 경우가 있을 것이다(시행 착오를 통해 환경을 구축하는 경우 등). 이럴 때, sandbox로써 컨테이너를 빌드하도록 하는 것이 바로 이 --sandbox옵션이다. 실행시 줄여서 -s로도 작성해도 된다.

  예를 들어 ch_sandbox라는 이름으로 컨테이너를 작성한다고 가정하자.

$ sudo singularity build --sandbox ch_sandbox docker://이미지명 or 파일명.def # Docker이미지 혹은 def파일을 지정

 이 커맨드를 실행시키면 .sif 파일이 아닌 ch_sandbox(본인이 지정한 이름의 컨테이너)의 디렉토리가 생성된다. 디렉토리 자체로 내부를 수정하는 것이 가능하지만, .sif 파일과 동일하게 ch_sandbox를 shell 커맨드에 전달한다. 여기서 다시 --writable 옵션을 붙이면 수정 가능한 형태로 컨테이너에 접근한다. 옵션을 붙이지 않으면 기본 읽기 전용이므로, 읽기 전용이된다.

$ singularity shell ch_sandbox #.sif파일과 동일하게 다룬다
$ sudo singularity shell --writable ch_sandbox #수정이 가능하다

 이와 처럼 컨테이너를 넣으면 내부에서 apt install 커맨드로 패키지나 라이브러리를 설치해보거나 커스터마이즈하거나 해서 가볍게 시도해볼 수 있게 된다. 다만, root권한이 필요한 작업은 sudo를 커맨드 맨 앞에 붙여야한다.

 이제 커스터마이즈가 끝나면, sandbox를 sif로 변환한다.

$ singularity build 파일명.sif ch_sandbox

 

 

실행 방법


# GPU를 사용해서 shell을 사용할 때 (GPU를 사용할 때에는 --nv옵션을 붙여야 한다).
$ singularity shell --nv  파일명.sif

# GPU를 사용해서 어떠한 커맨드를 실행시킬 때 (예를 들어 jupyter lab을 실행 시킬 때는 커맨드 부분에 jupyter lab)
$ singularity exec --nv 파일명.sif 커맨드

# 다른 디렉토리를 마운트 할 때
$ singularity shell --bind 마운트하는 디렉토리:컨테이너내에서 마운트할 디렉토리 파일명.sif 

 이번 포스팅에서 주로 다룰 주된 주제는 Singularity이미지에 대한 내용이므로 Singularity의 실행에 대해서는 간략히 작성만 해두도록 하겠다. 


참고자료

https://qiita.com/fleming_tone/items/fc03570ac5b8de1cf027

https://qiita.com/HoriThe3rd/items/6982247ac0f612d0474a

https://ie.u-ryukyu.ac.jp/syskan/service/singularity/

728x90