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

MIKE.aeon님의 프로필 이미지

작성한 질문수

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

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

docker locale 변경 문의.

해결된 질문

21.03.28 23:30 작성

·

722

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
질문자

2021. 04. 04. 00:07

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

게시판 기능에 네이버 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

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

2021. 04. 01. 15:50

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

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

0

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

2021. 04. 01. 01:22

감사합니다. 강사님.

알려주신 설정으로 하다가 오류난 부분은 구글링했더니, 아래 처럼 설정하니 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

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

2021. 03. 31. 14:54

도커는 호스트 컴퓨터의 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 작성법 공식문서