티스토리 뷰
참조
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 경로 확인
- mcr.microsoft.com/mssql/server:2022-latest 이미지에서는 sqlcmd 경로가 위와 같다
- (github에 올려진 이미지는 2017 버전 대상이라 경로가 달랐음 😵💫
- -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 실행) 명령어 실행을 대기하는 케이스를 다루어보아서 유용했다.
- Total
- Today
- Yesterday
- nuxt3 quasar 설정
- unmounted document.addlistener
- vue unmounted
- docker mssql 이미지 생성
- 외래키 삭제
- 스파르타 코딩클럽
- nuxt3 structure
- docker mssql create database
- unplugin-auto-import
- 티스토리챌린지
- Oracle Database 19c install
- 스마트피싱보호_캠페인
- nuxt3 프로젝트 설정
- unmounted composable
- vue watch 문제점
- dockerignore
- vue onunmounted
- vue watch 위험성
- oracle 19c 설치
- 오블완
- nuxt3 eslint prettier 설정
- vue 이벤트 해제
- docker image 경량화
- vue 타이머 해제
- Oracle Database 19C 설치
- unmounted setinterval
- vue 리팩토링
- vue watch 대체
- docker multi stage build
- docker mssql
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
