2023. 10. 9. 00:00ㆍDevOps/GitLab CI CD
자 이제 gitlab ci cd 에서 aspnet core 를 배포하고 db 를 migration 하는 것을 확인 하였다.
이제 이 내용을 조금 더 발전 시켜보자
1. ASPNET Core 배포
현재 Dockerfile 에서 dotnet sdk 7.0 와 aspnet runtime 7.0 을 사용하고 있다.
image 가 생각보다 클것이다.
이것을 수정해서 image 를 줄여보자
linux 에서는 alpine 이라는 최소사양만 가지고 있는 linux 배포판이 있다.
주로 이러한 container app 을 배포할 때 사용된다.
우리는 이 dotnet 관련 alpine image 들을 이용하여 publish 를 다시 실행 시킬 것이다.
Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
WORKDIR /source
COPY . .
WORKDIR /source/ApiServer
RUN dotnet publish -r linux-musl-x64 -c release --no-self-contained -p:PublishReadyToRun=true -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS runtime
WORKDIR /publish
COPY --from=build /publish ./
RUN mkdir ~/.aws &&\
mkdir /usr/local/bin/aws
ENTRYPOINT ["dotnet", "ApiServer.dll"]
위에서 sdk 와 aspnet runtime image 가 -alpine 이 붙어 있다.
이렇게 되어 있으면 linux-musl-x64 로 -r 을 지정해서 publish 가 가능하다.
그럼 image 이 크기가 상당히 줄어드는 것을 볼 수 있다.
2. efbundle.exe 를 이용한 bundle 배포
db migration 을 위해 bundle 배포를 활용하고 있다.
docker run 시에 실행되도록 하여 gitlab ci / cd 에서 dependency 를 삭제하겠다.
efbundle.exe 에 오른쪽 버튼을 눌러 속성을 다음과 같이 변경한다.
Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
WORKDIR /source
COPY . .
WORKDIR /source/ApiServer
RUN dotnet publish -r linux-musl-x64 -c release --no-self-contained -p:PublishReadyToRun=true -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS runtime
WORKDIR /publish
COPY --from=build /publish ./
RUN chmod +x entrypoint.sh &&\
mkdir ~/.aws &&\
mkdir /usr/local/bin/aws
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
#!/bin/sh
chmod +x efbundle.exe
./efbundle.exe --connection ${CONNECTION_FROM_ENV}
dotnet ApiServer.dll
Gitlab CI/CD
variables:
CONTAINER_NAME: $CONTAINER_NAME
IMAGE_NAME: $IMAGE_NAME
DB_CONNECTION_STRING: $DB_CONNECTION_STRING
DB_CONNECTION: $DB_CONNECTION
before_script:
- |
echo "Stopping and removing container:" $CONTAINER_NAME
docker stop $CONTAINER_NAME 2> /dev/null || true
docker rm $CONTAINER_NAME 2> /dev/null || true
docker rmi $IMAGE_NAME 2> /dev/null || true
stages: # List of stages for jobs, and their order of execution
- build
docker_build:
stage: build
script:
- echo "docker building the code..."
- docker buildx build
-t $IMAGE_NAME
-f Dockerfile .
# --build-arg ARG_CONNECTION_STRING=$DB_CONNECTION_STRING
- docker run
-e ConnectionStrings__Server=$DB_CONNECTION
-e Logging__LogLevel__Default="Warning"
-e CONNECTION_FROM_ENV=$DB_CONNECTION_STRING
-v ~/.aws:/root/.aws
-v /usr/local/bin:/usr/local/bin
--name $CONTAINER_NAME -d --restart unless-stopped -p 5006:80
--network my_network $IMAGE_NAME
--add-host host.docker.internal:host-gateway
- echo "docker build complete."
$DB_CONNECTION_STRING (Gitlab ci/cd variable)
Server=host.docker.internal;Port=3306;Database=api-server;user=root;password=1234
위와 같이 하면 container 에서 host 로 접근이 가능하다. (127.0.0.1 과 같다.)
** HasData 를 이용해서 ef core 에서 seed data 를 넣게 되면.. efbundle.exe 의 크기가 비정상적으로 커진다.
버그 같은데... **
관련영상
'DevOps > GitLab CI CD' 카테고리의 다른 글
Gitlab CI CD - Docker 에서 aws cli 사용하기 (0) | 2023.11.20 |
---|---|
Gitlab CI CD - Docker 에서 host 의 aws 설정 사용하기 (1) | 2023.09.18 |
Gitlab CI CD - Linux 에서 Gitlab-Runner 설치 및 활용 (0) | 2023.09.11 |
Gitlab CI CD - ASPNET Core 배포 및 DB Migration (0) | 2023.09.04 |