지금까지는 눈으로 학습했는데, AWS ECR에 올리는 실습을 직접 하려다 보니 로컬에서 spring boot 빌드하는 환경 구성에 시간을 잡아먹고있습니다. 개발자가 아니라서 이런 개발환경은 너무 낯선데, 다른방법으로 빌드할수는 없을까요. VSCODE에서 SpringBoot Extention Pack으로 고군분투해봐도 시간만 소요될 뿐 진행되지 않아 문의드립니다.
아마 h2같은 in-memory DB를 사용하지 않고, 직접 mysql driver를 추가한 경우는 datasource객체를 만드려고 시도하면서 url, username, password같은 정보가 없다면 스프링 서버를 띄우기도 실패할 것입니다! 이렇게요. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. 스프링 프로젝트를 생성하면 최초로 만들어지는 // java @SpringBootTest public class XXTests { @Test void contextLoads() { } } // kotlin @SpringBootTest class XXTests { @Test fun contextLoads() { } } 이 테스트코드도 실패할거에요 그럴때는 해당 클래스 파일을 없애거나 @SpringBootTest 어노테이션을 제거하거나 맨 위에 @Disabled를 추가해줘서 테스트를 생략하게 하면 될 것 같습니다! 보통 테스트코드에서도 스프링 컨테이너 뜰 때 드라이버가 있다면 DataSource 빈을 만드려고 시도하다가 기본 ENV가 없다면 실패할 것 같은데.. 재성님은 아마 테스트코드를 지우신게 아닐까 생각되네요!
백업은 안하려고 한참 헤메다, 결국 백업으로 해결했네요..ㅎ.. 환경: window pc에 mariadb client 버전을 설치함 dump 생성 client 버전이기 떄문에, “ mariadb prompt ” 를 실행해서 아래의 명령어 실행 (cmd에서 mariadb, mysql 명령어 동작 안함) # 생성할 위치로 이동하시거나, 덤프 생성할때 경로 작성하시요. cd "어느 경로"/docker_file # 덤프 생성 mysqldump -u root -p --all-databases > all.sql Dockerfile 생성 # Docker Hub에서 공식 MariaDB 이미지 사용 FROM mariadb:latest # 초기화 시 자동 실행될 SQL 복사 COPY ./all.sql /docker-entrypoint-initdb.d/ # 포트 개방 EXPOSE 3306 이미지 생성 및 컨테이너 실행 docker build -t [당신의 게정은?]/mariadb:1.0 . docker run -d \\ -p 13306:3306 \\ --name mariadb \\ --network ecommerce-network \\ -e MARIADB_ROOT_PASSWORD=[당신의 root 비번]\\ kimjinwon1432/mariadb:1.0 =============== 추가 ============== 강사님께서 알려주신 방법으로 진행해봤어요. 일단, 제 pc의 mariadb 설치경로가 "C:\Program Files" 였기 때문에, mariadb폴더 내의 data 폴더와 그 하위 파일 및 디렉터리를 C: 밑에 우리가 사용하는 docker_file 폴더에 넣었습니다 * Program Files를 경로로 잡으시면 13에러 코드가 발생합니다. 이는 권한 관련 문제이므로 cli에서 사용하시는 계정에 대해서 mariadb 폴더 내부에 권한을 주셔도 소용이 없어요. * 이 과정은 이전에 설치한 mariadb 이미지가 있으면 삭제?하거나 이미지의 이름을 변경해서 진행하세요 .(전 삭제함) * 제 pc의 mariadb 의 버전이 11.4.2여서, docker에서 사용할 수 있는 가장 근접한 버전으로 진행했습니다. docker run -d -p 13306:3306 --network ecommerce-network \ -e MARIADB_ROOT_PASSWORD=[비번] \ --name mariadb -v "C:\study\SpringCloud\docker_files\data:/var/lib/mysql" \ mariadb:11.4.7 이렇게 하시면 docker exec -it ~~~ /bin/bash를 통해서 db에 접속 후 데이터베이스를 확인하면 로컬에서 작업했던 db의 데이터가 docker로 전해진 것을 확인 할 수 있어요.
실무에서 설정 파일의 내용을 어떻게 관리하시는지 궁금하여 질문 드립니다. 제 생각엔 [ '평문' -> jasypt 암호화 -> keytool 암호화 ] 이 과정으로 서버에 설정 정보를 저장하는 것이 좋을 거 같은데, 사바사 일거 같지만.... 보통 이렇게 2번 암호화를 하는지 궁금하네요.
ImagePullPolicy: IfNotPresent를 설정했지만 여전히 NAME READY STATUS RESTARTS AGE spring-pod 0/1 ErrImageNeverPull 0 59s 라고 나옵니다. 제가 찾아보니 docker 이미지는 데몬 에서 생성되었고, Kubernetes의 런타임이 자기 저장소에서 spring-server 이미지를 찾을수없다고 나오는데 이럴때 어떻게 해결해야하나요?
ECR에서 이미지를 못받아 오는거같습니다... 무슨 문제일까요.. NAME READY STATUS RESTARTS AGE spring-deployment-6fdbd9cd87-j8ljj 0/1 ErrImagePull 0 6m1s spring-deployment-6fdbd9cd87-mchqp 0/1 ErrImagePull 0 6m1s spring-deployment-6fdbd9cd87-tp5x6 0/1 ErrImagePull 0 6m1s Error from server (BadRequest): container "spring-container" in pod "spring-deployment-6fdbd9cd87-j8ljj" is waiting to start: trying and failing to pull image Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m7s default-scheduler Successfully assigned default/spring-deployment-6fdbd9cd87-j8ljj to ip Normal Pulling 70s (x5 over 4m6s) kubelet Pulling image "960452239058.dkr.ecr.ap-northeast-2.amazonaws.com/kube-ecr:1.0" Warning Failed 70s (x5 over 4m6s) kubelet Failed to pull image "960452239058.dkr.ecr.ap-northeast-2.amazonaws.com/kube-ecr:1.0": rpc error: code = NotFound desc = failed to pull and unpack image "960452239058.dkr.ecr.ap-northeast-2.amazonaws.com/kube-ecr:1.0": no match for platform in manifest: not found Warning Failed 70s (x5 over 4m6s) kubelet Error: ErrImagePull Normal BackOff 10s (x15 over 4m5s) kubelet Back-off pulling image "960452239058.dkr.ecr.ap-northeast-2.amazonaws.com/kube-ecr:1.0" Warning Failed 10s (x15 over 4m5s) kubelet Error: ImagePullBackOff 아키텍처 불일치 문제 같은데 ARM64용 이미지 빌드 및 푸시를 해서 해결하려니 Dockerfile이 없다고 ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory 꼬리에 꼬리를 무는게 뭔가 잘못된방향으로 가는거 같아서 도움이 필요합니다..
위와 같이 로그가 찍혔으면, DLQ에서 ack 상태가 되어야하는것 아닐까요? @RabbitListener(queues = RabbitMQConfig.DLQ) public void process(String message) { System.out.println("DLQ Message Received: " + message); try { String fixMessage = "success"; rabbitTemplate.convertAndSend( RabbitMQConfig.ORDER_EXCHANGE, "order.completed.shipping", fixMessage ); System.out.println("DLQ Message Sent: " + fixMessage); } catch (Exception e) { System.err.println("### [DLQ Consumer Error] " + e.getMessage()); } } 위의 코드인 경우 AUTO 모드로 동작해서 자동으로 DLQ에서 처리가 되면 ACK 을 받을 것이라 생각했는데, DLQ에서 unack 상태로 남아있어서 여쭤봅니다! 이후에 애플리케이션을 종료하면 DLQ에서는 다시 ready 상태가 되고, 애플리케이션을 실행하면 이를 실행하고 와 같이 로그가 찍힌 다음에 다시 unack 상태가 됩니다. 좋은 강의 감사드립니다 :)
강의대로 docker-compose-single-brokey.yml 파일 작성하고 파일 안에 맨 밑에 networks: my-network: external: true name: ecommerce-network 이렇게도 작성하고 아래 명령어 그대로 docker-compose -f docker-compose-single-broker.yml up -d 입력했는데 Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets 이런 오류 가 발생합니다..
DevOps를 위한 Docker 가상화 기술 (Private Harbor Registry)
argocd에서 sync를 하여 cd를 하게 되면, 몇초 이따가 STATE: ImageInspectError, STATE DETAILS: Failed to inspect image "": rpc error: code = Unknown desc = unable to convert a nil pointer to a runtime API image 라는 에러가 발생합니다. 여러 자료를 찾아보니 인증서 문제 같다고 하여서 호스트 PC에서 Harbor의 cicd-web-project:태그를 docker pull 하여 보니 tls: failed to verify certificate: x509: certificate signed by unknown authority 인증서 관련 에러가 발생하였습니다. 아무래도 자체 인증으로 인하여 Harbor 레지스트리에서 신뢰하지 못하는 CA 인증서를 사용하기 때문인 것 같은데, 강사님께서 강의를 하시기 이전에 이러한 문제가 생겨서 조치한 부분이 있으실까요? 아니면, 이 부분은 Docker 업데이트로 인하여 이제는 제가 따로 인증서를 구하여 적용을 해야할까요?? 추후에 프로젝트에서 쿠버네티스까지 적용할 예정이어서 argocd에 대한 테스트를 정확히 하고 싶은데, 지금은 눈으로 보고 넘어가고, 프로젝트를 할때, 제대로 된 인증서를 발급 받아서 붙이는게 나을까요?
@Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactor, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactor); container.setQueueNames(QUEUE_NAME); container.setMessageListener(listenerAdapter); return container; } @Bean public MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver, "receiveMessage"); // Receiver의 메소드명 } 안녕하세요. 좋은 강의해주셔서 감사합니다. 만약 하나의 큐에서 여러 컨슈머를 통해 동시에 여러개를 소비하고자한다면 Receiver를 추가해서 새롭게 MessageLisnterAdaper 빈을 추가하는걸까요? 어떤식으로 하는것인지 궁금합니다. 여러큐와 거기에 따른 여러 컨슈머 구성시에는 어떤식으로 환경설정하면 될까요? 감사합니다.