docker image를 계속 받다보니 용량이 쌓인다.

실행중인 컨테이너가 아닌, 기존에 쌓인 이미지를 삭제하자.

docker images -a
 

삭제할 이미지를 선택해보자. 제일 위의 이미지를 삭제해보자.

docker rmi [Image ID]

 

docker rmi [Image ID] // rmi -> remove image

 

정상적으로 삭제된다.

*** 추가

  1. 몇 안되는 경우지만, tag name이 달라도 이미지 ID가 중복되는 사례를 몇번 식별했다. 이런 경우
docker rmi [Image ID] // rmi -> remove image

 

위 명령어를 사용해도 소용이 없는데, 이런 경우

docker rmi [이미지이름:tag]

로 하면 태그네임을 기준으로 삭제한다.

2. 테스트 하느라 너무 많은 이미지를 docker pull로 받았을 경우, 일일이 제거해주기 귀찮다.

이때 안쓰는 이미지를 삭제하는 방법이다.

docker image prune -a

 

생각해보니 Spring 을 구동하기 위해서 꼭 필요한 Java 설치에 대한 글을 올린 적이 없다.

M1 맥북 기준으로 Java를 설치해보자.

2019년 1월부터 Oracle JDK 가 유료화되었기 때문에 나는 Open JDK(무료)를 사용해보겠다.

 

 

Azul Downloads

No matter the size of your company, Azul offers competitive pricing options to fit your needs, your budget, and your ambition.

www.azul.com

 

위 링크로 접근하여, 아래와 같은 옵션으로 다운로드 받는다.

필자는 설치만 해도 jdk 가 잘 나온다.(환경변수 따로 설정하지 않았다.)

그러나 대부분의 분들이 Java 환경변수를 설정해야 된다고 하므로

설정해보자..(사실 내가 환경변수를 설정했는데 기억하지 못하는 걸수도 있다)

sudo nano ~/.zshrc

이후

#JDK version PATH
export JAVA_HOME=/Library/Java/JavaVirtualMachines/[JDK 폴더명]/Contents/Home


#Add Environment Variable
export PATH=$JAVA_HOME/bin:$PATH
 

요렇게 경로 지정하고

아래와 같이 터미널에서 입력 시 jdk 정보가 제대로 나오면 성공한 것이다.

java --version

 

Docker 로 스벨트와 스프링을 배포를 하다가.. 저런 에러가 발생했다.

난 처음에는 Docker 문제가 아닌 서버의 방화벽 문제인가 하다가.. 지인의 권고대로

서버자체에서 해당 Docker로 배포한 스벨트에 접근을 못하고 있는 것 같다는 얘기를 듣고..

시도해보았다.

wget localhost:3000 // 여기서 localhost는 Docker로 배포한 스벨트의 url 임

저렇게해보니 정말 접근이 안되더라..

여기저기 둘러보니 나는 스벨트를 배포할때 vite를 사용해서 npm run preview로 배포하고 있었다.

DockerFile(변경전)

... 생략

# 프로그램 실행
CMD ["npm","run","preview"]

그런데, 저렇게 배포를 하면 localhost도, 127.0.0.1도 아닌 0.0.0.0 으로 배포한다고 한다..(윙..?)

그래서 해결방법은 이것저것 많았지만, 가장 간단하면서도 나에게 쉬운방법은 위 코드를 일부만 변경하면 된다.

DockerFile(변경후)

... 생략

# 프로그램 실행
CMD ["npm","run","preview","--", "--host"]
 

저렇게 하니 127.0.0.1, localhost 도 같이 개방된다.

평상시 나는 서버에 도커 실행을 하려면 어지간해서는 서버가 꺼지지 않기에

재시작 설정을 거의 하지 않았다.

그러나 이번에 고객사 서버의 전원이 불량상태로, 잦은 재시작을 하여 교체전까지는 그대로 사용해야 하는 상황이라 재시작 설정 및 도커 데몬 자동 설정을 해야만 했다.

  1. 도커 데몬 자동 실행

* 리눅스

sudo systemctl enable docker // 시스템 재시작시 자동 사용 설정
 

* 윈도우

General -> Start Docker Desktop when you log in 항목 체크, Apply & restart 버튼 클릭

2. 도커 컨테이너 자동 재시작 명령어

# 새로운 컨테이너 생성 시 재시작 정책 적용 
docker run -p [포트번호:포트번호] --restart unless-stopped -d [도커이미지]
 

개발환경에서는 IDE에서 프로그램을 실행시키면 실시간으로 로그를 확인할 수 있지만

도커와 같은 배포환경에서는 로그를 확인하기 쉽지않다.

아래 명령어는 도커를 실행시키고 발생되는 로그를 실시간으로 확인하는 명령어이다.

docker logs -f --tail 10 [컨테이너명] // 뒤에 숫자 10은 라인의 갯수를 의미한다.

 

뒤의 숫자는 로그의 라인 갯수를 의미한다.

숫자를 빼도 되지만, 배포환경에서는 로그가 실시간으로 다수의 내용이 올라오기 때문에 식별이 어려워

필요한 만큼만 숫자지정을 하는 게 좋다.

 

Mac 환경에서 인터넷에서 다운로드받은 pkg 로 실행시키려다가

예기치 않은 에러가 발생했다.

이런식으로 발생했는 데, 찾아보니 해결법이 있어서 작성한다.

1.시스템 환경설정 탭으로 이동, 보안 및 개인정보 보호 아이콘 클릭

2. General 버튼 또는 일반 버튼을 클릭하여 Open Anyway 또는 항상 오픈 버튼 클릭

실행하지 못한 파일이 위 그림과 같이 나올텐데 항상 열기 또는 Open Anyway 버튼을 클릭하여

실행하면 된다.

'Mac' 카테고리의 다른 글

[Mac] gem ffi 관련 오류  (0) 2025.02.14

맥에서 cocoapods를 gem으로 install 하려다가 아래와 같은 에러가 발생했다.

별의별 방법을 다써도 안됐는데, 결론은 아래 명령어를 실행하라는 거였다.(반드시 sudo를 붙여야 한다.)

아래 명령어는 Ruby로 만들어진 gem의 확장파일들을 다시 빌드해주는 행위다.

sudo gem pristine ffi

결과 화면

 

정상설치된 cocoapods

'Mac' 카테고리의 다른 글

[Mac] 확인되지 않은 개발자가 배포한 앱 실행방법  (0) 2025.02.14

XCode 로 팀 설정을 하다 오류가 생겼다.

내용을 보니, 번들 패키지명이 유니크하지 않고 이름이 겹칠 우려가 있으니

제대로 된 이름을 입력하라는 것이었다.

그래서 변경한다.

1. General 버튼 클릭, Bundle identifier 입력칸에 제대로 된 패키지명 입력

Xcode 내 General 화면, Bundle identifier 를 수정해주자

2. Signing & Capabilities 버튼 클럭, 서명완료된 것을 확인

Signing & Capabilities 화면, 서명이 완료된 것을 확인할 수 있다.

별 거 아닌 에러지만 처음보면 당황할 수 있다.

당황하지 않고 에러 내용을 잘 확인해보자!

지난 포스팅에

IOS 환경에서 웹뷰를 구현했는 데 문제는 웹뷰에 연결하는 시간이 오래 걸려

사용자가 텅 빈 화면을 볼 수 있다는 게 문제였다.

때문에 지난 포스팅에 이어 프로그레스바 옵션을 추가하겠다.

import WebKit
import UIKit

class ViewController: UIViewController, WKUIDelegate,WKNavigationDelegate {
    
    var webView : WKWebView!
    var progressView: UIProgressView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
            let site = "http://도메인주소.kr"
            let url = URL(string: site)
            let request = URLRequest(url: url!)
            webView = WKWebView(frame: self.view.frame)
            webView.navigationDelegate = self
            webView.uiDelegate = self
            webView.load(request)
            self.view.addSubview(webView)
           // 여기서부터 프로그레스바
            progressView = UIProgressView(progressViewStyle: .default) 
            progressView.sizeToFit()
            progressView.frame = CGRect(x: 0, y: 64, width: self.view.bounds.size.width, height: 20)
            self.view.addSubview(progressView)
            self.webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
    }
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "estimatedProgress" {
             progressView.progress = Float(webView.estimatedProgress)
             print(Float(webView.estimatedProgress))
            if Float(webView.estimatedProgress) == 1.0 { // 로딩이 다되면
                progressView.progress = 0 // 0 으로 초기화
            }
        }
     }
}

 

스타일 관련해서 디테일 한 부분은 공식문서 참고해주시고,

프로그레스바가 100프로 만족되면 0으로 초기화 시키는 로직을 추가하였다.

 

 

 

끝!

IOS 에서 WebView 를 구현하는 방법은 두가지가 있다고 한다.

기본 WebView 와 WK WebView 가 있는 데

기본 WebView 는 매우 예전부터 쓰는 방식이고 성능도 그다지 좋지 않아

애플 개발자 센터에서도 권장하지 않아 요즘엔 WK WebView 를 쓴다고 한다.

이제 시작해보자.

* 프로젝트 생성은 다들 아실테니 생략~

1. View Controller 소스 수정

import WebKit
import UIKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView : WKWebView!
    
    override func loadView() {
          let webConfiguration = WKWebViewConfiguration()
          webView = WKWebView(frame: .zero, configuration: webConfiguration)
          webView.uiDelegate = self
          view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string:"http://호출도메인.kr")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}

2. Info.plist 파일 수정 * http 사이트만 해당

나의 경우 http 사이트 였기 때문에 Info.plist 를 수정해야 한다.

1. App Transport Security Settings 추가 
2.위 1번 하위 속성-> Allow Arbitrary Loads
 

주의할 점은 하위 속성을 추가할 때 제목 앞부분의 화살표를 활성화 시키고 해야 된다는 점이다.

안 그러면 엉뚱한 곳에 생성된다.

3. Product -> Run 버튼 실행

잘 실행된다. 혹시 안되시는 분은 Xcode 의 개발자 서명이 안되있을 수 있으니

+ Recent posts