사용자이름과 프로젝트명을 영어 소문자로 시작하도록 설정해야 추후 진행하는 단계에서 에러가 발생하지 않을 것입니다.
본인이 프로젝트에 사용한 jdk 버전에 맞게 부분 수정해주시면 됩니다.
저는 17버전을 사용했기에 아래와 같이 작성했습니다.(다른 버전이신 분들은 아래 사이트 참고해서 gradle 버전 설정해주시기 바랍니다!)
jdk버전에 따른 gradle 버전 정보
# Dockerfile
FROM gradle:7.3.1-jdk17-alpine as builder
WORKDIR /build
# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true
# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel
# APP
FROM openjdk:17.0-slim
WORKDIR /app
# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8080
# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [ \
"java", \
"-jar", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Dsun.net.inetaddr.ttl=0", \
"app.jar" \
]
우측 상단에 New Project/repository
버튼 누르시고 Project import 하시면 됩니다
이후 Import Project
를 클릭해서 GitHub에서 연동할 프로젝트를 선택 후 import
합니다
GitLab -> 좌측 탭(CI/CD -> Editor) -> .gitlab-ci.yml 파일 작성
stages:
- dockerbuild-push
package:
image: docker:latest
stage: dockerbuild-push
services:
- docker:dind
before_script:
- docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
script:
- docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME .
- docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
after_script:
- docker logout
$ 로 표현된 환경변수 설정이 필요합니다
GitLab -> 좌측 탭(Settings -> CI/CD -> Variables)
$ 앞서 .gitlab-ci.yml 파일에 있는 변수명과 동일하게 값을 할당해주면 됩니다!(File형식 말고 그냥 값 입력하면 됩니다~)
GitLab -> 좌측 탭(CI/CD -> Editor)
버튼을 클릭해서 작성한 CI스크립트를 실행합니다.
만약, 위 사진과 같이 하단에 Commit changes
버튼이 활성화되지 않는다면 아무 공간에 엔터를 입력해서 변경사항을 만든 후 버튼이 활성화되는 것을 볼 수 있습니다.
만약, 신용카드 등록을 하지 않았다면 failed가 되면서 Credit Card등록하라는 문구가 나오는대 이에 맞춰서 등록을 진행해주시면 됩니다. 1달러가 들어왔다가 다시 출금될 것입니다.
Step 5를 다시 진행합니다.
아래와 같이 성공적으로 진행된다면 Login Success / Job succeded 등의 문구가 나오면서 실행이 완료되어 이미지가 생성됩니다.
GitLab -> 좌측 탭(Packages and registries -> Container Registry)
이후 CI진행했던 프로젝트를 클릭하면 생성된 이미지를 확인할 수 있습니다
빨간 네모를 클릭해서 latest 버전의 이미지 경로를 복사할 수 있습니다.
EC2에서 docker 명령어를 통해 생성된 이미지를 pull 받아서 실행해보겠습니다.
ubuntu@ip:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu@ip:~$ sudo docker pull {이미지 경로}
latest: Pulling from kyunghwan1207/hospital-community
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
Digest: xxx
Status: Downloaded newer image for {이미지 경로}
ubuntu@ip:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
{Repository 경로} latest xxxx 25 minutes ago 452MB
이제 pull 받은 이미지를 통해 container를 띄우겠습니다.
(아래 명령어들은 가독성을 위해 엔터로 분리했으니 실제로 입력하실 때엔 엔터 대신 스페이스바로 한칸만 띄우면서 명령어 작성해주시기 바랍니다!)
ubuntu@ip:~$ sudo docker run -p 8080:8080 --name hospital-community
-e SPRING_DATASOURCE_URL=jdbc:mysql//{RDS 엔트포인트}:3306/{Database 이름}
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD={비밀번호}
-d {Repository 경로}
-e
옵션은 application-aws.yml 파일에서 입력했던 DB 접속 정보--name
옵션에는 아무거나 입력해주셔도 괜찮습니다(추후 docker ps
로 확인할 때 사용할 이름)-e
옵션으로 환경변수 설정해주어야합니다. =
사이에 공백이 있으면 안되고 포트번호 8080이 이미 물려있다면 8082:8080 등으로 다른 포트번호 물리시기 바랍니다!-d
옵션으로 백그라운드에서 실행할 이미지 입력할 때 docker images
명령어로 확인한 {Repository 주소}
를 입력해주시기 바랍니다!앞서 docker run
명령어를 실행한 후 return 된 containerID를 가진
Container 정보가 나오지 않는다면 정보를 잘 못입력해서 제대로 실행되지 못한 것이기에
$ sudo docker ps -a
$ sudo docker rm {ContainerID}
한 이후에 -e 옵션에서 적용한 환경변수 값(USERNAME=root인데 admin으로 했거나, 비밀번호를 잘못입력하거나), DB이름을 잘못 입력했거나 등을 다시 한 번 확인한 후 9번 과정을 진행합니다.
만약 sudo docker rm {ContainerID}
를 하지 않고 다시 9번 과정을 한다면 docker이름이 이미 존재한다는 에러가 발생하기에 사용하지 않는 container들은 바로바로 stop 해주는 것이 좋습니다!
만약 잘 동작해서 Container 정보를 확인할 수 있었는대 어떤 작업도 안했는대 몇 초 있다가 container가 내려간다면..(docker ps -a
명령어로 확인가능) EC2 용량문제이기 때문에 t2.micro로 사용했던 분들은 t3.small로 바꿔서 진행하시는 걸 추천드립니다!