티스토리 뷰

참조

docker mssql 이미지

https://hub.docker.com/r/microsoft/mssql-server

mssql 도커 이미지 만들기

using an entrypoint.sh and setup.sql scripts to create a database⁠

🚀 들어가며

docker를 이용하여 mssql을 설치를 하여 사용할려고 하였다.

그러나 다른 db 이미지와는 다르게 초기 DB 생성을 하는 환경변수를 제공하지 않았다. 😢

그래서 DB 생성을 하는 방법을 찾아보니 도커 이미지 공식 문서에 쉘 스크립트를 이용하여 생성하는 방법이 있었다.

docker image 생성

아래는 공식문서에 안내된 github 링크에서 제공하는 파일들을 참조하여 만들었다.

다음과 같이 5가지 파일들이 필요하다

  • Dockerfile
  • entrypoint.sh
  • configure-db.sh
  • setup.sql
  • .dockerignore

실제 디렉토리 이미지

entrypoint.sh 을 작성하여 docker container 시작 쉘스크립트를 작성하고 관련된 쉘스크립트를 실행해주는 방식이다.

sqlserver가 실행된 뒤에 DB 생성이 가능하므로 쉘 명령어 sleep 을 활용한 쉘 스크립트 작성을 하여 DB 연결 성공까지 재시도를 하는 방식으로 진행된다.

✔️ 나는 docker compose를 이용하여 컨테이너를 생성할 것이기 때문에 docker-compose.yaml 파일도 추가되었다.

Dockerfile

FROM mcr.microsoft.com/mssql/server:2022-latest

USER root
ENV MSSQL_SA_PASSWORD=bhconsulting1!
# Create a config directory
RUN mkdir -p /usr/config
WORKDIR /usr/config

# Bundle config source
COPY . /usr/config

# Grant permissions for to our scripts to be executable
RUN chmod +x /usr/config/entrypoint.sh
RUN chmod +x /usr/config/configure-db.sh

ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh

#!/bin/bash

# Start the script to create the DB and user
/usr/config/configure-db.sh &

# Start SQL Server
/opt/mssql/bin/sqlservr

configure-db.sh

#!/bin/bash

# Wait 60 seconds for SQL Server to start up by ensuring that 
# calling SQLCMD does not return an error code, which will ensure that sqlcmd is accessible
# and that system and user databases return "0" which means all databases are in an "online" state
# <https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-databases-transact-sql?view=sql-server-2017> 

DBSTATUS=1
ERRCODE=1
i=0

# 60초까지 sqlcmd 명령어 성공을 확인한다.
# 성공이 되면 반복문 종료
for i in {1..60}; do
  /opt/mssql-tools18/bin/sqlcmd -S localhost -C -U sa -P "$MSSQL_SA_PASSWORD" -Q "SELECT 1" &> /dev/null
  if [ $? -eq 0 ]; then
    echo "SQL Server is ready!"
	ERRCODE=0
    break
  fi
  # 1초 대기
  sleep 1
done

if [ $ERRCODE -ne 0 ]; then 
	echo "SQL Server took more than 60 seconds to start up or one or more databases are not in an ONLINE state"
	exit 1
fi

# Run the setup script to create the DB and the schema in the DB
# -C: validation 없이 server 인증서 신뢰
/opt/mssql-tools18/bin/sqlcmd -S localhost -C -U sa -P $MSSQL_SA_PASSWORD -d master -i setup.sql

✅ Check Point

  • sqlcmd 명령어가 성공할때 까지 재시도 (60초 까지 제한)
  • /opt/mssql-tools18/bin/sqlcmd 경로 확인
  • -C option
    • 해당 옵션이 없으면 SSL 인증서 실패 오류가 발생한다. (여기서 많이 해멤 😓)

setup.sql

/*

Enter custom T-SQL here that would run after SQL Server has started up. 

*/
/* BhCon DB 생성 */
CREATE DATABASE BhCon;
GO

.dockerignore

.dockerignore
Dockerfile
docker-compose.yaml

Dockerfile 을 통한 빌드 시, 필요없는 파일이 COPY 되는 것을 방지하기 위함

컨테이너 생성

docker-compose.yaml 을 통해서 컨테이너를 생성한다.

docker-compose.yaml

volumes:
  v-db:
services:
  mssql:
    container_name: mssql
    image: bh-mssql
    ports: 
      - 1433:1433
    volumes: 
      - v-db:/var/opt/mssql
    restart: always
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_SA_PASSWORD=test1234! # 8글자 이상, 문자, 대문자, 숫자, 특수문자 중 3가지 이상 사용
      - MSSQL_PID=Developer

생성

docker compose up -d

이렇게 하면 setup.sql에 명시된 Database 가 생성되어 있는것을 확인 할 수 있다.

마치며

docker 사용을 하다보면 언제나 기본 실행되는 명령어외에 쉘 스크립트를 실행해야 할 일이 종종 있었는데, 이번 기회에 sleep 을 활용하여 메인 프로세스가 실행된 이후에 (여기서는 sql server 실행) 명령어 실행을 대기하는 케이스를 다루어보아서 유용했다.

댓글