인프런 커뮤니티 질문&답변

MIKE.aeon님의 프로필 이미지

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

구글 클라우드 플랫폼 (Google Cloud Platform) 에서 배포하기

docker locale 변경 문의.

해결된 질문

작성

·

727

1

안녕하세요 강사님. 

도커의 locale 관련 문의 드립니다.

리눅스에서 환경에서는 정상동작하던 부분이 도커로 올리면서 언어셋이 꼬인것처럼 오류가 발생합니다.

리눅스(우분투)의 locale 은 아래와 같습니다.

도커(tiangolo/uwsgi-nginx-flask)의 locale 은 아래와 같습니다.

도커에서 LANG=en_US.UTF-8 으로 변경하려면 어떻게 해야하는지 문의 드립니다.

구글 클라우드에서도 동일한 문제가 발생하여 도커를 사용하지 않고 클라우드에 직접 환경을 구성했습니다. 다행이 구글 클라우드에는 locale -a 로 확인해보니 영문설정이 있어서 설정만 변경하고 재부팅후 서비스를 확인하니 정상동작했습니다.

아래 내용은 구글 클라우드의 locale -a 내용입니다.

도커에서 LANG=en_US.UTF-8 으로 변경하려면 어떻게 해야하는지 문의 드립니다.

감사합니다.

답변 4

0

MIKE.aeon님의 프로필 이미지
MIKE.aeon
질문자

언어셋 문제인지 아닌지 조금 헷갈립니다. 

게시판 기능에 네이버 api 를 추가해서 검색 기능을 추가했습니다. 이게 네이버 api 방식인데,  구글클라우드에서는 정상동작하는데, 도커에 올리면 정상동작을 하지 않는 문제로, 강좌랑 상관없는 부분이라 문의 드리기 좀 죄송합니다.

urlopen 에서 오류가 발생한거 같은데, 도저히 감을 못잡겠습니다.

시간이 되시면 한번 봐주시고 어느쪽으로 고민을 해야할지 방향정도만이라도 조언 부탁드립니다.

1. 소스는 아래와 같이 간단합니다.

    encText = urllib.parse.quote(keyword) # 검색어 인코딩
    url = URL + encText # 'https://openapi.naver.com/v1/search/blog?query='+'인코딩된키워드'
    request = urllib.request.Request(url) 
    request.add_header("X-Naver-Client-Id",client_id) # 네이버에 등록된 개발자 키값추가
    request.add_header("X-Naver-Client-Secret",client_secret) # 네이버에 등록된 개발자 키값추가
    response = urllib.request.urlopen(request) # 여기서 인증 관련 오류 발생.

2. 오류 내용은 아래와 같습니다.

[pid: 18|app: 0|req: 12/17] 62.170.200.183 () {44 vars in 1055 bytes} [Sat Apr  3 14:52:32 2021] GET /trendy/getBlogs?keyword=%27%EB%A9%B4%EB%8F%84%EA%B8%B0%27 => generated 290 bytes in 247 msecs (HTTP/1.1 500) 3 headers in 374 bytes (1 switches on core 0)
[2021-04-03 14:52:33,289] ERROR in app: Exception on /trendy/getShops [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/urllib/request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/usr/local/lib/python3.6/http/client.py", line 1262, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1308, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1257, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1036, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.6/http/client.py", line 974, in send
    self.connect()
  File "/usr/local/lib/python3.6/http/client.py", line 1423, in connect
    server_hostname=server_hostname)
  File "/usr/local/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/usr/local/lib/python3.6/ssl.py", line 817, in __init__
    self.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 1077, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./main/naver_api.py", line 84, in decorated_function
    res = f(*args, **kwargs)
  File "./main/naver_api.py", line 160, in getShops
    return getSearchList(keyword, NAVER_SHOP_API_URL)
  File "./main/naver_api.py", line 37, in getSearchList
    response = urllib.request.urlopen(request) 
********* urlopen 이부분에서 오류가 발생한거 같은데, 감이 오질 않습니다.
  File "/usr/local/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/usr/local/lib/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/usr/local/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.6/urllib/request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/usr/local/lib/python3.6/urllib/request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>
[pid: 18|app: 0|req: 13/18] 62.170.200.183 () {44 vars in 1055 bytes} [Sat Apr  3 14:52:33 2021] GET /trendy/getShops?keyword=%27%EB%A9%B4%EB%8F%84%EA%B8%B0%27 => generated 290 bytes in 137 msecs (HTTP/1.1 500) 3 headers in 374 bytes (1 switches on core 0)
62.170.200.183 - - [03/Apr/2021:14:52:33 +0000] "GET /trendy/getShops?keyword=%27%EB%A9%B4%EB%8F%84%EA%B8%B0%27 HTTP/1.1" 500 290 "http://35.194.133.222:88/trendy/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" "-"

0

남박사님의 프로필 이미지
남박사
지식공유자

" 언어셋이 꼬인것처럼 오류가 발생합니다. "

이 부분에 대한 내용을 보여주시면 저도 확인을 한번 더 해보도록 하겠습니다. 

0

MIKE.aeon님의 프로필 이미지
MIKE.aeon
질문자

감사합니다. 강사님.

알려주신 설정으로 하다가 오류난 부분은 구글링했더니, 아래 처럼 설정하니 locale 은 변경되었는데, 아직도 오류는 발생합니다. 좀더 고민좀 해봐야 알것 같습니다.

혹시나 언어 설정부분 변경하고 싶은신 분들은 아래 내용 참고하시기 바랍니다.

----------------------------

# 도커 이미지를 생성할 원본 도커 이미지
FROM tiangolo/uwsgi-nginx-flask:python3.6

# 필요한 라이브러릴 설치 해야 합니다.
RUN pip install --upgrade pip
# RUN pip install flask flask-pymongo flask-wtf

# 현재 호스트 경로에서 도커내부의 폴더로 파일을 복사 합니다.
COPY . /app

# 아래 명령어는 소스파일을 먼저 복사해야 함.
RUN pip install -r requirements.txt

# 버전호환 문제로 삭제후 특정버전으로 다시 설치함
RUN pip uninstall -y pymongo
RUN pip install pymongo==3.7.2
# 언어설정 변경하는 부분.
RUN apt-get update
RUN apt-get install -y locales
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
RUN update-locale LANG=en_US.UTF-8

# 작업 경로를 /app 으로 설정합니다.
WORKDIR /app

0

남박사님의 프로필 이미지
남박사
지식공유자

도커는 호스트 컴퓨터의 os 설정과 아무런 관련없이 동작합니다. 따라서 현재 도커가 구동중인 우분투의 로케일이 어떻게 설정되어있던 도커 입장에선 상관할바가 아니게 됩니다. 도커는 그냥 독립적으로 구동되는 os 가 되게 됩니다. 그런 관점으로 보면 tiangolo/uwsgi-nginx-flask 도커의 로케일이 그렇게 나오는건 도커에 사용된 우분투 설정이 그렇게 되어있기 때문입니다.

이를 수정하려면 간단한 방법으론 도커 실행시 환경변수 옵션을 사용하여 설정하는 방법이 있습니다.

docker run -it -e LANG=en_US.UTF-8 "도커명"

위의 명령 인자값이 구동되지 않는 경우에는 도커구동하는 Dockerfile 자체를 수정해서 locale 을 설치하고 구동하는 방식으로 접근해봐야 할듯 합니다.

# Dockerfile 예제
RUN apt-get update RUN apt-get install locales ENV LANG en_US.UTF-8 ENV LANGUAGE en_US.UTF-8 RUN update-locale LANG=en_US.UTF-8

위의 Dockerfile 코드를 참고하시어 수정해보셔야 할듯 합니다.

en_us.utf-8 구글 검색

Dockerfile 작성법 공식문서