728x90
반응형

도커 알 못이 파이썬 스크립트를 서버에서 돌려야 해서 도커로 이미지 빌드하고 올리는 과정 정리

(한 3개월 전에 도커로 올렸었는데 오늘 다시 하려니 까먹어서 정리해 놓기로 마음먹음)

 

1. 파이썬 스크립트를 작성한다.

2. 도커파일을 작성한다.

  -> 도커파일에 무슨 내용을 적어야 할 지부터 일단 의문이었던 기억.

3. 도커 빌드.(이미지 만들기)

  -> 그냥 도커 빌드 명령어를 쓰면 됨

4. 도커 푸시

5. 원하는 서버에서 도커 풀 받아서

6. 원하는 포트를 지정해 도커 런!

 

일단은 위와 같은 단계로 도커 이미지를 만들고 빌드를 시키고 서버에서 작동을 시켰다.

각 과정에서 사용한 명령어 정리 한 후 '와당탕탕' ㅋㅋㅋ을 정리해보려고 한다.


1. 파이썬 스크립트 작성

이건 그냥 원하는 스크립트를 뚝딱뚝딱 작성하면 되는 것이니 패스! 

나는 fastapi로 api를 만들었다.(?)

 

2. 도커파일을 작성한다

스크립트가 실행되는 위치에 Dockerfile <-- 이 이름으로 된 파일을 작성한다.

나는 파이참 IDE를 사용해서 코드를 짜서 그냥 New File 눌러서 Dockerfile로 이름 적어 파일을 생성했다. .yaml 파일 작성하듯이 내용을 작성하면 된다.

다양한 명령어가 있고 효율 좋게(?) 돌아가게 하는 기능도 있지만 나는 아래와 같이 간단하게 작성했다.

# 베이스 이미지 명시
FROM python:3.7.8

# 컨테이너 실행 전 수행할 쉘 명령어
RUN mkdir -p /opt/myservice
WORKDIR /opt/myservice
COPY . .
RUN pip install -r ./requirements.txt


# 컨테이너가 시작되었을 때 실행할 쉘 명렁어
# 도커파일 내 1회만 실행할 수 있음
EXPOSE 8802
CMD python main.py

 

3. 도커 빌드

> docker build --tag server:port/myservice:0.1 .

위 명령어로 도커 빌드를 하고 나는 업무용 서버에 이미지를 빌드할 것이기 때문에(?) 일단 저렇게 이미지를 빌드하였다.

저렇게 빌드하고 '> docker images' 명령어를 치면 이미지가 생성된 것을 확인할 수 있다.

 

4. 도커 푸시

위에서 생성한 도커 이미지를 서버에 푸시하기 위한 과정이다.

> docker push server:port/myservice:0.1

지정된 서버에 해당 이름으로 이미지가 푸쉬되었다.

 

5. 도커 풀

작동하기 원하는 서버에서 이미지를 올린 서버로부터 이미지를 내려받는 과정이다.

> docker pull server:port/myservice:0.1

위 명령어로 도커 이미지를 pull 받았고 docker ps 해보면 이미지가 받아진 것을 확인할 수 있다.

이제 하나 남음!!!

 

6. 도커 런

이미지를 받았으니 이제 컨테이너 실행을 시켜주면 된다.

도커 런을 시키면 되는데 이 때 옵션을 다양하게 붙이면 원하는 대로 뭔가 해볼 수 있는 듯 하다 ㅋㅋ

나는 그냥.. 필요한 것만 아래와 같이 사용했다.

 > docker run -d -it -p 8802:8802 --name myservice0.1 server:port/myservice:0.1

 

참고: https://docs.docker.com/engine/reference/commandline/run/

불러오는 중입니다...

위 링크에서 여러가지 옵션들을 확인할 수 있다.


와당탕탕 1. 도커 빌드가 안된다!

일단 스크립트를 작성해서 도커 빌드를 해보려고 했음

스크립트야 그냥 api 개발한 거고 도커 빌드를 해보려는데 이상한 에러들이 뜸

=> ERROR [internal] load metadata for docker.io/library/python:3.7.8
= failed to fetch oauth token: unexpected status: 401 Unauthorized

요런 에러들...

그래서 찾아봤더니 도커 로그아웃하고 다시 로그인 하면 된단다!!

> docker logout
> docker login

위와 같이 명령어를 하나씩 쳐 주고 도커 빌드를 하니 성공!

물론 login 할 때 username과 password를 알고 있어야 한다. ㅋㅋㅋㅋ 기억 안나서 뇌정지 온 사람(나)

 

 

와당탕탕 2. 포트 지정 (feat. Dockerfile)

도커 빌드하고 이미지 push 이후 원하는 서버에서 pull 받아 run을 할 때 포트 지정을 해 주려고 한다.

두번째 도커 개발이라 도커파일 작성조차 익숙하지 않아 이 전에 개발했던 Dockerfile을 복사해서 설정값을 그냥 아무 생각 없이 띵가띵가 바꿨다.

그러고 서버에서 이미지 pull 받아 아래 명령어로 run 시키는데 돌긴 돌아도 테스트가 안되는 것이었다!!

> docker run -d -it -p 8802:8802 --name name0.2 myserver2:5000/name:0.2

 '> doekr ps' 해보면 포트가 자꾸 8800를 가리키게 되어 있었다.

뭘까뭘까 엄청 고민해 보다가 하.. 내가 이 전에 올린 api의 포트를 8800으로 해놨는데 해당 Dockerfile 그대로 복사해서 쉽게쉽게 가려다가 그 8800 포트 적은게 그대로 이미지로 만들어져 버렸던 거구나... 싶었다.

그래서 Dockerfile의  EXPOSE 값을 내가 원하는 포트번호인 8802로 수정하고 위 명령어로 런 시키니 잘 작동하는 것 확인!

728x90
반응형
728x90
반응형

파이썬... 

 

sql 문장을 만들거나 어떠한 이유로 python 코딩을 하다가 다중 라인의 스트링을 입력해야 할 때가 있습니다.

심지어 변수도 들어가게 되면 코드는 더러워지게 마련입니다.

 

문제는 없지만 보기가 너무 더럽고 관리하기 어려우니 여러 해결 방법이 있습니다.

https://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string

 

Pythonic way to create a long multi-line string

I have a very long query. I would like to split it in several lines in Python. A way to do it in JavaScript would be using several sentences and joining them with a + operator (I know, maybe it's n...

stackoverflow.com

제가 참고한 글입니다.

 

아니면 f-string이었나? string intnerpolation 이라고 

f"""value1={value1}""" 이렇게 값을 감싸고 문자열에 바로 변수 값을 집어넣는 기능을 사용할 수 있습니다.

 

이 방법의 경우 파이썬 3.5부터 지원됩니다.

728x90
반응형
728x90
반응형

Python argument 파싱(parsing)

.py 프로그램 실행 argument 주고 파싱하는 방법

 

1. Bash 또는 terminal에서 실행:

> python main.py --option1=test1 --option2=test2

 

 

2. main.py 에서

import argparse



def main(args):

	option1 = args.option1

	…


if __name__ == '__main__':

	parser = argparse.ArgumentParser(description="option test")



	parser.add_argument('--option1', help="description option1", type=str, action='store')	

	parser.add_argument('--option2', help="description option2", default='default value', type=str, action='store')



	args = parser.parse_args()

	main(args)

위와 같이 실행

728x90
반응형
728x90
반응형

Disable tensorflow warning message

 

keras model을 로드하거나 tensorflow를 import 하고 코드를 실행할 때 warning message가 거슬리게 자꾸 터미널에 나타날 때가 있습니다.

코드가 실행이 안되는게 아니라 이런 워닝 메시지가 자꾸 뜹니다. 실행은 잘 되고...

 

거슬려도 참고 테스트 하다가 이걸 좀 처리를 해줘야겠다! 해서 첫 번째 아래 시도를 해 봤습니다.

import warnings

warnings.filterwarnings(action='ignore')

흠.. 주피터 노트북에서 실행할 때는 효과가 있는 듯했지만 역시나 tensrflow 워닝은 잡아주지 못하더군요..

그래서 silence_tensorflow 라는 모듈을 import 했습니다.

> pip install silence_tensorflow

먼저 install을 해주고, 아래와 같이 사용합니다.

from silence_tensorflow import silence_tensorflow
silence_tensorflow()

from keras.models import load_model

 

그랬더니 아주 깔끔하게 워닝 메시지는 출력하지 않습니다!

모델 하나 가져오려고 하니 워닝이 막막 엄청 많아...

 

그럼 이만 :-)

728x90
반응형
728x90
반응형

Python OpenCV 정리 | cv2.imread(), cv2.imshow(), cv2.imwrite()

 

개인 프로젝트로 이미지 처리 & 인식을 하고 있는데, 오늘은 이미지 처리의 기본인

이미지 읽기, 보기, 저장하기를 정리해보려고 합니다!

 

공식 문서를 먼저 파악하는 편인데, 매번 까먹다 보니 한번 정리를 하면 좋겠더군요 :)

파이썬에서 OpenCV를 사용하려면 면저 아래와 같이 모듈을 import 해야 합니다.

import cv2

 

cv2.imread() : 이미지 읽기

import cv2

img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)

위와 같이 읽고자 하는 이미지의 경로를 첫 번째 파라미터로 주어 이미지를 읽어올 수 있습니다. 

 

조금 더 자세히 살펴보자면,

cv2.imread(fileName, flag)

  • fileName (str) – 이미지 파일의 경로
  • flag (int) – 이미지 파일을 읽을 때의 Option
  • return: image 객체 행렬

flag는 이미지 파일을 읽을 때 주는 옵션입니다.

  • cv2.IMREAD_COLOR : 이미지 파일을 color로 읽어 들임
  • cv2.IMREAD_GRAYSCALE : 이미지 파일을 grayscale로 읽어 들임
  • cv2.IMREAD_UNCHANGED : 이미지 파일을 alpha 채널까지 포함하여 읽어 들임

위와 같이 옵션을 줄 수 있으며 1, 0, -1로도 줄 수 있습니다.

 

cv2.imshow() : 이미지 보기

import cv2

img = cv2.imread("test.img", cv2.IMREAD_COLOR)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

읽어 들인 이미지를 윈도우 창에 보여주게 되는데, 조금 더 자세히 살펴보겠습니다.

 

cv2.imshow(title, image)

  • title - 윈도우 창의 이름
  • image - 읽어들인 이미지 객체

cv2.waitkey(0)cv2.destryAllWindows() 는 각각 keyboard 입력을 대기하는 함수와 윈도우 창을 모두 닫는 함수입니다. 

이 함수를 써주지 않으면 중간에 오류가 나기도 합니다.

 

cv2.imwrite() : 이미지 저장

import cv2

gray = cv2.imread("test.img", cv2.IMREAD_GRAYSCALE)

cv2.imwrite('gray_test.png', gray)

읽어 들인 이미지를 저장하는 함수입니다. 

경로를 지정해 저장할 수 있으며, 중간에 이미지 처리(노이즈 제거, 색 변환, 원근 변환 등)을 통해 변환된 이미지를 저장할 수 있습니다.

 

cv2.imwrite(fileName, image)

  • fileName (str) – 저장될 파일명
  • image – 저장할 이미지

오늘은 이미지 처리의 기초가 되는 읽고, 보고, 저장하는 방법을 정리해 봤습니다.

앞으로 시간이 생길 때 더 다양한 모듈을 정리하고 파이썬에서 시각화를 할 수 있는 matplotlib에 대해서도 조금 정리를 해 보면 좋겠군요! 

유익하게 보셨다면 댓글을 달아주세요 ㅎㅎ (광고도 클릭해주세요)

 

그럼 이만 :)

728x90
반응형
728x90
반응형

파이썬에서 파이썬 호출 인자 사용하기

 

파이썬 실행 파일을 호출할 때 인자를 넘겨줘야 할 때가 있습니다.

예를 들어 호출 하며 파일 경로를 달리해 저장 또는 읽을 파일 경로를 알려줄 수 있습니다.

 

이 때는 아래와 같이 사용하시면 됩니다.

import argparse

parser = argparse.ArgumentParser(description='Argparser')
# argument는 원하는 만큼 추가한다.
parser.add_argument('path1', type=int, help='first path')
parser.add_argument('path2', type=int, help='second path')

args = parser.parse_args()

path1 = args.path1
path2 = args.path2

 

우선 argparser를 import 하고

원하는 argument를 추가하여 호출 시

> python test.py 1 2

와 같이 호출하며 1과 2는 인자입니다. 위의 예시에서는 1(파일 이름) 경로와 2(파일 이름) 경로로 이해하시면 되겠습니다.

 

질문이 있으시다면 아래 댓글을 달아주세요 :)

728x90
반응형

+ Recent posts