해결된 질문
21.03.28 23:30 작성
·
723
1
안녕하세요 강사님.
도커의 locale 관련 문의 드립니다.
리눅스에서 환경에서는 정상동작하던 부분이 도커로 올리면서 언어셋이 꼬인것처럼 오류가 발생합니다.
리눅스(우분투)의 locale 은 아래와 같습니다.
도커(tiangolo/uwsgi-nginx-flask)의 locale 은 아래와 같습니다.
도커에서 LANG=en_US.UTF-8 으로 변경하려면 어떻게 해야하는지 문의 드립니다.
구글 클라우드에서도 동일한 문제가 발생하여 도커를 사용하지 않고 클라우드에 직접 환경을 구성했습니다. 다행이 구글 클라우드에는 locale -a 로 확인해보니 영문설정이 있어서 설정만 변경하고 재부팅후 서비스를 확인하니 정상동작했습니다.
아래 내용은 구글 클라우드의 locale -a 내용입니다.
도커에서 LANG=en_US.UTF-8 으로 변경하려면 어떻게 해야하는지 문의 드립니다.
감사합니다.
답변 4
0
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
0
2021. 04. 01. 01:22
감사합니다. 강사님.
알려주신 설정으로 하다가 오류난 부분은 구글링했더니, 아래 처럼 설정하니 locale 은 변경되었는데, 아직도 오류는 발생합니다. 좀더 고민좀 해봐야 알것 같습니다.
혹시나 언어 설정부분 변경하고 싶은신 분들은 아래 내용 참고하시기 바랍니다.
----------------------------
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 코드를 참고하시어 수정해보셔야 할듯 합니다.