Skip to main content

🐋 Python 프로젝트를 위한 Docker 베이스 이미지 선택 시 Alpine Linux를 피해야 하는 이유

Chanho Lee
다양한 분야를 공부하고 있는 학생

Introduction

Django를 활용하여 블로그를 만들어보는 프로젝트를 진행하다가 docker로 환경을 옮기는 도중 여러 에러들을 만났다. 이 글은 문제를 해결하면서 얻은 지식을 공유하고자 작성한 글이다.

첫 번째 문제

Alpine Linux와 cryptography의 호환성 문제

Dockerfile, docker-compose.yml 파일을 작성 후 마지막으로 빌드를 하던 중 아래의 에러를 만났다.

ERROR: No matching distribution found for cryptography==3.4.7

현재 Dockerfile에서 사용하는 image 버전과 requirements.txt에 적힌 cryptography 버전은 아래와 같다. 이렇게 설정해두고 docker-compose로 빌드를 하려고 했는데 에러가 발생한 것이다.

FROM python:3.8-alpine
cryptography==3.4.7

해결

alpine linux와 python에서 암호화 알고리즘이 구현된 패키지인 cryptography의 호환성 문제라고 생각했고, cryptography의 공식 문서를 참고하여 해결책을 찾아보았다.

crypto-doc

대략 요약하면 cryptography 패키지는 Rust를 빌드할 때 사용한다. 즉, Rust의 패키지 관리자이자 빌드 도구인 cargo를 같이 설치해야지 돌아간다는 것이다.

$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo

위의 코드를 Dockerfile에 추가하면서 첫 번째 문제는 잘 해결할 수 있었다.

두 번째 문제

빌드가 오래 걸리다가 안 되는 문제

위의 명령어를 Dockerfile에 추가하고 다시 build 하면 당연히 잘 작동될 거라 생각했으나 아래와 같이 다시 한 번 에러가 발생했다. 이미지를 보면 알 수 있듯이 still running이 지속되는 상황이다. 대략 10분 정도 그대로 놔뒀는데도 빌드가 안 되고 계속 진행하다가 종료가 된다.

더 상세한 details

해결

계속 구글링을 하면서 이 문제를 해결하려 했으며, cryptography 라이브러리와의 문제일 수도 있다고 생각하여 공식 문서도 다시 다 읽어보고, 라이브러리의 GitHub 이슈도 찾아보았다.

더 상세한 details

대략적으로 비슷한 이슈를 찾을 수 있었다. 위의 이미지는 cryptography GitHub 저장소에서 가져온 한 이슈 이미지다. 현재의 상황과 비슷하여 답변을 참고할 수 있었다.

대략 요약하자면 아래와 같다.

  1. Alpine Linux에서 Python 패키지를 빌드하는 작업이 느리며, 특히 CI/CD 환경에서 매번 빌드해야 하는 경우 비효율적이다.
  2. Python의 pip 및 휠 패키징과 관련하여 Alpine과 호환 가능한 휠을 업로드하는 작업이 필요하지만, 이는 pip/wheel/packaging 및 관련 PEP 논의가 필요하다.
  3. 최신 Alpine 환경에서 Python 패키지를 제대로 설치하려면 최신 Rust 컴파일러가 필요하다.
  4. Alpine에서 발생하는 이와 같은 문제는 문서화되어 있고, 현재로서는 개선 사항이 없으므로 추가적인 문제가 있다면 새로운 이슈를 열거나 PR(Pull Request)을 제출해야 한다.

이 답변에서의 핵심은 결국 1번과 2번이었다. 즉, Alpine 리눅스가 문제였고, 아래와 같이 이미지만 바꿈으로서 문제를 해결할 수 있었다.

FROM python:3.8-slim-buster

근데 문제만 해결하면 끝일까? 그건 아니다. 이유를 알아보자.

Alpine Linux가 파이썬 환경에서 적절하지 않은 이유

내가 alpine linux를 사용한 이유는 Ubuntu linux와 비교했을 때 용량도 작고 빌드할 때 더 빠르기 때문이다. 즉, 경량화가 잘 되어 있기 때문이다. 그러나 이 이미지는 python 환경에서는 적절하지 않다.

그 이유는 사용하는 라이브러리의 차이에서 시작된다. 대부분의 리눅스 배포판은 파이썬을 포함한 모든 C언어 프로그램에 필요한 C언어 표준 라이브러리인 GNU 라이브러리(glibc)를 사용한다. 그러나 Alpine Linux는 좀 더 경량화하기 위하여 GNU 라이브러리를 사용하는 것이 아니라 musl 라이브러리를 사용한다. 이 musl 라이브러리는 GNU 라이브러리로 컴파일 된 Wheel 바이너리를 지원하지 않는다. 그렇기 때문에 .whl 확장자를 갖는 패키지를 다운 받는 것이 아니라 .tar.gz 확장자 파일을 다운 받게 된다. 즉, alpine linux를 사용하는 경우 사용하는 모든 파이썬 패키지의 C 코드를 컴파일 해야 하므로 빌드 시간도 오래 걸리며 용량도 커진다는 것이다.

최근 대부분의 파이썬 패키지에는 PyPI의 Wheel 바이너리가 포함되어 있어 설치 시간이 빠르다. Wheel은 사실 .whl 확장자와 특별한 형식의 파일 이름으로 이루어진 ZIP 형식을 아카이브한 것이다. 쉽게 말하면 확장자만 바꾼 것이다.

  1. 빌드가 느리다.
  2. 이미지 용량이 커진다.
  3. 시간이 많이 낭비된다.(빌드하는 과정)
  4. 런타임 버그들을 만날 수 있다.

위의 이유들로 인해, Python 환경에서는 Alpine Linux보다는 Debian 기반의 slim 이미지나 Ubuntu 기반 이미지를 사용하는 것이 더 적합하다.

🌐References

✨10월 회고

Chanho Lee
다양한 분야를 공부하고 있는 학생

이전 글에서 10월 목표를 적었었다. 내 목표는 이루었는지 점검해보고자 이 글을 작성한다. 10월을 잘 살지 못 해서 이 글을 적는 것이 조금 무섭지만 그래도 적어본다.

독서

  • 몰입의 즐거움
  • 원씽
  • 오픈

이렇게 3권의 책을 읽었다. 책 읽으면서 반성이 되기도 하고, 내가 지금 너무 많은 것을 하려고 있는가에 대해 또 다시 생각하게 되면서 지금 나에게 당장 필요 없다고 생각하는 부분들은 없애고 있다.

자기 1시간 전에 독서하는 것도 목표였는데 이것도 첫 주는 잘 됐다. 근데 자기 전에 졸려 죽겠는데 인증까지 하는 것이 너무 귀찮아서 관두게 됐다. 지금은 책을 읽고 싶을 때나 여유롭다고 판단되는 주말 아침에 조금씩 읽고 있다.

현재 읽고 있는 책은 소프트웨어 엔지니어 가이드북이다. 이 책을 다 읽고 여유가 된다면 다음 책으로는 한강 작가님의 작별하지 않는다를 읽어 보고 싶다.

스터디

  • ETL 스터디(러닝 스파크): 데이터 엔지니어, 소프트웨어 엔지니어 분들과 함께 공부했던 스터디라 실제 현업에서의 내용도 들을 수 있었고, 배울 점이 정말 많았던 스터디였다. 한 가지 아쉬운 점은 책을 다 읽고 프로젝트를 하는 것까지 목표였는데, 졸업 작품이 마무리가 되어 가다 보니 바빠져서 집중할 시간이 없다고 판단하여 그만두었다.
  • 알고리즘 스터디(Coursera Stanford Algorithms): 이 강의는 알고리즘을 수학적으로 접근하는 부분들이 많아 좀 많이 어려웠다. 그렇지만 또 다시 알고리즘을 개념적으로 접근하여 공부하니 시간 복잡도 계산이 훨씬 수월해졌고, 알고리즘 문제를 푸는데도 도움이 됐다.
  • DDIA 스터디(데이터 중심 애플리케이션 설계): 이 스터디에도 DE, SWE 분들이 대부분이었어서 많은 걸 배울 수 있던 스터디였으나 지금의 나에게는 너무 어려운 내용이기도 하고, 마찬가지로 졸업 작품 때문에 너무 바빠져 그만두었다.

적다 보니 다 그만둔 내용 밖에 없는 것 같다. 아무래도 졸업 작품 마무리가 곧 다가오다 보니 그쪽에 더 신경을 쓸 수 밖에 없었다. 데이터 중심 애플리케이션 설계 책 같은 경우에는 나중에 바쁘지 않을 때 스터디를 다시 해야 할 것 같다. 책이 어렵기도 하고, 다른 분들과 함께 경험을 위주로 얘기하면서 공부하면 더 도움이 될 책이라 생각한다.

개인 공부

인과추론: 첫 주에 열심히 하다가 그만두었다. 정말 공부해보고 싶었던 분야지만 현재 내가 해야 할 공부는 아니라 판단했다. 지금은 취업 준비를 위한 공부가 더 우선이라 생각했다.

자바스크립트: 코어 자바스크립트 책을 다 읽었다. 정말 유익한 책이라 생각한다. 핵심만 들어가 있고, 책의 두께가 두껍지 않아 편하게 읽을 수 있었다. 이것도 사실 내가 프론트엔드로 취직할 것도 아니고 꼭 필요한 것은 아니지만 그래도 책이 얇아 읽어볼 수 있었다.

학교 수학 강의: 선형대수학, 확률 및 통계 그리고 고등학교에서 공부했던 수학에 약간의 정보 이론이 추가된 교양 강의다. 많은 분야를 한 번에 다루고 예전에 공부했던 것들이라 큰 어려움은 없었다.

졸업 작품

프로젝트 자체는 거의 마무리가 되어 전체 과정을 계속 반복해보면서 우리가 만든 알고리즘이 잘 작동되는지 확인했다. 그러고는 포스터를 만드는 것에 집중했다. 팀 미팅으로 주 3번 정도는 필수로 했고, 교수님과의 미팅은 매번 있던 것처럼 2주에 한 번씩 진행했다. 팀 미팅에는 언제나 조교님께서 조언을 해주시고, 방향성을 잡아주셔서 포스터도 깔끔하고 예쁘게 만들 수 있었다.

졸업 작품은 나중에 따로 회고를 올릴 예정이다.

취업 준비

이력서 작성

영문 이력서 작성을 마무리 했고, 가장 들어가고 싶었던 기업에 지원한 상태이다. 서류 합격을 했고, OA까지 본 상태이며 지금은 면접을 준비하고 있다. 이 채용 프로세스가 끝나면 한국어 이력서도 작성해둘 예정이다.

이전 프로젝트 코드 정리

지금까지 학교에서 진행했던 프로젝트를 아직 정리하고 있는 상태이다. 2000줄이 넘는 프로젝트도 있고, 했던 일들이 너무 많아 정리하기가 쉽지 않았다. 주석도 영문으로 바꾸고, 전체적으로 어떻게 작동되는지 구조를 파악하면서 공부 중이다. 특히 이력서에 적었던 프로젝트를 중심으로 정리하고 있다.

알고리즘

원래 목표는 매일 세 문제씩 푸는 것였지만 현재는 한 문제로 푸는 것으로 변경했다. 그 이유는 시간 때문이다.난 매일 아침에 일정 시간 내에만 알고리즘을 풀고 있따. 주어진 시간 내에 문제를 풀고, 해설을 보면서 내가 작성한 코드와 비교하고, 다시 생각하다 보면 시간이 확 가버려서 한 문제만 풀게 됐다. 리트코드 기준으로 easy, medium 문제를 풀면서 어떻게 접근해야 하는지 등을 중심으로 생각하면서 풀고 있다.

네트워킹

강북에도사람있또

글또에 강북에도사람있또 모임에 한 번 참여했다. 노원에서 만날 줄 알았는데 의외로 충무로에서 모임을 진행했고, 오랜만에 꽤 멀리 놀러 가서 좋았다. 또, 개발이나 대학원 얘기 그리고 이것저것 다양한 주제의 얘기들도 할 수 있고, 들을 수 있어서 좋은 시간이었다. 이 모임을 통해 내 고민도 어느 정도 해결이 됐다. 그때 가장 큰 고민은 '어떤 분야로 앞으로 나아가야 할지 잘 모르겠다' 였는데 범용성을 생각하거나 완전히 하나의 분야만 파거나 둘 중 하나를 선택하라고 하신 조언이 나에게 엄청 와닿았다.

어색함 반, 재미 반이었지만 새로운 사람들과 만나서 얘기하는 건 언제나 재밌다. 특히 내 고민을 쉽게 얘기할 수 있다는 것도 너무 좋고, 다른 분들의 고민이나 경험을 들어볼 수 있다는 게 너무 큰 재미라고 생각한다. 동기부여도 되고, 평소 못 나누던 얘기들도 할 수 있기도 했다. 역시 커뮤니티가 주는 힘은 크다고 생각한다.

당근 테크 밋업

당근 테크 밋업에 운 좋게 참여할 수 있었다. 난 Data/ML 쪽에서 강연을 들었고, 또 운 좋게 다양한 당근 팀들과 네트워킹을 할 수 있었다. 당근 팀들과 네트워킹을 하는 것은 선착순이었다. 정말 빠른 속도로 네트워킹이 마감되었는데 채용 팀과의 네트워킹은 못 한 것이 매우 아쉬웠다.

다녀와서 내린 결론이 하나 있었다. 지금은 MLOps 직무는 아예 고려하지 않기로, 그리고 데이터 엔지니어링도 역시 생각하지 않기로 했다. 이런 직군은 보통 다 이직을 통해 되거나 직장에서 시켜서 일을 하게 되는 직무인 걸 알고 있음에도 '혹시나 신입에게 기회가 있지 않을까'라는 생각에 고려하고 있었는데 깔끔하게 놓아주기로 했다. 이건 데이터 엔지니어링 스터디를 진행하면서도 생각하게 된 결과이다.

그리고 만약에 MLE가 되고 싶다면 ML 기본기와 코딩 테스트는 잘 준비해야 한다. 유저 서비스 경험도 있으면 좋지만 신입에게 그것까지 바라지는 않는다고 하셨다. 그리고 프로젝트 경험은 역시나 캐글을 추천하셨다.

영어 공부

ChatGPT가 Advanced Voice Mode라는 기능을 발표했길래 영어 회화 공부를 해보려 했는데 상당히 쉽지 않았다. 스피킹은 난생 처음 해보는 거라 너무 어려웠고, 그러다 보니 습관으로 이어지지 않았던 것 같다.

11월 목표

  • 독서, 네트워킹은 취업에 방해되지 않는 선에서 조절
  • 리트코드 매일 1문제 풀기
  • 면접 준비
  • 졸업 작품 전시회 마무리
  • 스터디X

10월 목표에 비해 매우 단순해졌다. 면접을 앞두고 있다 보니 많은 것을 할 수 없는 상태이다.

나름 구체적으로 적었는데 또 나 자신과의 약속을 못 지킬까 두렵기도 하다. 그래도 내 블로그에 박제했으니 나 자신에게 부끄럽지 않으려면 고쳐야 하지 않을까. 결과가 어떻든 노력은 해보자.

📖 오픈

Chanho Lee
다양한 분야를 공부하고 있는 학생
info

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

나는 리뷰어다 2024

Book Info

tip

책 이미지를 클릭하면 교보문고 사이트로 이동합니다!

책

  • 제목: 오픈
  • 저자: 박수홍
  • 출판사: 한빛미디어
  • 출간: 2024-09-30

🎬 처음이자 마지막 글또 시작

Chanho Lee
다양한 분야를 공부하고 있는 학생

글또 10기

지원

이번에 글또 커뮤니티에 들어갈 수 있는 기회가 생겼다. 매 기수마다 참여하고 싶은 마음이 있었지만, 바쁘거나 체크를 안 해둬서 놓치는 경우도 있었고, 지원서를 작성하면서 '나' 자신을 되돌아 보는 것이 부담스러웠을 때도 있었다. 사실 이번에도 지원서를 작성하는 게 쉽지 않았지만, 이렇게라도 지금까지의 내가 뭘 했고, 어떻게 살았는지 다시 한 번 알아볼 수 있어서 정말 좋은 경험이었다. 그리고 무엇보다 이번이 글또의 마지막이기에 꼭 활동해보고 싶었다.

글또에서 이루고 싶은 목표

취업 준비 중이라 바쁘지만, 처음이자 마지막 글또 활동이기에 최대한 많은 활동을 해보려고 한다.

  • 다양한 소모임 채널에 참여
  • 다양한 분들과 커피챗 또는 모각코, 모각글
  • 건강한 삶을 위한 습관 형성

9월은 정말 힘든 달이었다. 취업 준비로 인한 온갖 스트레스에 시달리며, 평소 지키던 루틴은 무너져 버렸다. 일주일에 세 번씩 배달 음식을 시켜 먹었고, 혼자 술을 마시는 날도 잦았다. 우연히 글또에 들어올 수 있게 됐고, 이대로는 안 되겠다는 생각에 10월에는 글또의 다양한 소모임 채널에 참여하여 다시 건강한 습관을 만들기로 다짐했다.

그 중 하나로 예전의 뿌듯함과 성취감을 되찾고자 다시 6시 기상에 도전하고 있는데, 예전에는 그렇게 쉬웠던 일이 요즘에는 왜 그렇게 어려운지 모르겠다. 예상 외로 이번주에 가장 순조롭게 잘 해낼 수 있을 것 같았떤 기상 습관이 벌써 실패했. 그렇지만 포기하지 않고, 계속 도전할 예정이다. 비록 갑자기 너무 많은 것을 하려 해서 스트레스를 받고 있지만, 하루하루가 행복하고 감사하다.

스스로 아직 전문성이 부족하다고 생각하여 커피챗은 아직 조금 두렵기도 하다. 과연 내가 1:1로 대화를 하거나 여러 사람을 만났을 때, 과연 어떤 이야기를 나눌 수 있을지 고민이 된다. 다른 분들은 대부분 직장인이시기 때문에 나의 지식이나 경험이 부족하여 대화가 원활하게 안 이뤄질 수도 있지 않을까 걱정도 된다.

하지만 이런 고민은 항상 새로운 사람들을 만날 때마다 반복된다고 느낀다. 그렇기에 이번 글또를 잘 활용하여 이를 극복하고, 조금 더 적극적으로 소통해보려고 한다. 전문성에 대한 부담 내려놓고, 완벽하지 않아도 괜찮다는 마음으로 활동해보려고 한다. 어차피 난 아직 대학생이고, 직장인도 아니기에 나에게 큰 기대가 없을 것이다. 그러니 너무 걱정하지 말고, 이 시간을 충분히 즐기자.

그리고 어쩌면 내가 가진 작은 지식이나 경험도 누군가에게 큰 도움이 될 수도 있지 않을까? 나도 상대방의 이야기를 듣고 배우고, 나 또한 내 이야기도 해보면서 서로가 더 성장할 수 있는 그런 인연을 만들어 보고 싶다.

어떤 글을 쓸 것인가

난 블로그와 위키를 따로 운영하고 있다. 예전부터 위키에는 CS 지식이나 간단한 인사이트를 담고 싶었고, 블로그에는 단순히 지식을 전달하는 글이 아니라 나의 생각과 경험이 담긴 글을 적어보고 싶었다. 그리고 읽기 쉬우면서도 짧은 글이 아닌 조금 긴 글을 쓰고 싶었다.

post-planning.png

지금까지 생각한 주제는 위와 같다. 대략적으로 이런 내용들의 글을 쓰지 않을까 싶다. ML과 관련된 멋진 글을 써보고 싶기도 한데 아직까지는 어떤 주제로 글을 쓰게 될지 모르겠다. 활동하다 보면 좋은 글이 떠오르지 않을까 싶다.

10월 목표

마지막으로 10월 목표를 간단히 공유해보려고 한다! 항상 계획하고 목표를 설정하고 행동하려 하지만, 내 생각과 현실은 항상 다른 것 같다. 그래서 계획을 설정하는 것이 어렵지만 재밌기도 하다.

  • 매일 할 수 있는 습관 만들기
    • 6시 기상
    • 새벽 30분 공복 유산소(걷기, 뛰기)
    • 주 5일 웨이트(가슴, 등, 어깨, 하체, 팔)
    • ChatGPT와 함께 하는 영어 공부
    • 리트코드 최소 3문제 풀기
    • 자기 1시간 전에 최소 20p 독서
  • 스터디 참여
  • 개인 공부
  • 학교 강의
    • 교양 중간고사 대체 레포트 작성
    • 수학 과목 과제
    • 수학 과목 중간고사 공부(마지막 학기인데도 수학 과목을 듣는 미쳐버린 나)
  • 졸업 작품
    • 혈관 데이터 수집
    • 데이터 전처리(CLAHE, LDC(Lightweight Dense CNN for Edge Detection))
    • DVS(Dynamic Vision Sensor) 카메라로 촬영
    • YOLOv8을 활용하여 백혈구 카운팅
    • 계속 실험
  • 독서
    • 몰입의 즐거움(벌써 3번째 읽는 책)
    • 함께 자라기(다음 읽을 책)
  • 취업 준비
    • 이력서 작성
    • 지금까지 했던 학교 프로젝트 복습 후 GitHub에 깔끔하게 올리기
  • 행사 참여
    • 당근 밋업
    • 해커톤(학교 내부에서 곧 진행 예정)

이렇게 적어보니 정말 많은 것 같다. 일단 지금 하고 있는 것들과 예정되어 있는 걸 적어봤는데 변수가 더 있을 수도 있다. 어떻게 될지는 아무도 모른다. 개인적으로는 책을 더 읽고 싶은데 그럴 수 없는 게 안타깝다.

근데 나도 이걸 다 어떻게 하고 있는지 잘 모르겠다. 그냥 열심히 살려고 노력하다 보니 이렇게 된 것 같다. 스터디 중에서 러닝 스파크랑 데이터 중심 애플리케이션 설계는 읽어도 읽어도 정말 어렵다는 느낌을 받고 있다. 나중에 또 읽어 봐야 할 거 같은 느낌. 인과추론은 얼마나 더 어려울까 기대 반, 걱정 반이다.

Oct-planning.png 성윤님께서 알려주신 napkin.ai를 활용해서 시각화 해봤다. 예쁜 UI를 만들어 준다는 점에서 앞으로 자주 쓸 것 같다. 좋은 툴 알려주셔서 감사합니다!

진짜 마무리

이렇게 긴 글을 쓰는 건 역시 어렵다고 느낀다. 그렇지만 계속 쓰다보면 실력도 늘지 않을까? 6개월 후의 나는 어떤 변화를 겪었을까. 글또를 통해 변화될 내가 기대된다. 그때는 얼마나 많은 인연을 만들었을까? 어떤 글을 쓰고 있을까? 어떻게 살고 있을까? 그때를 기다리면서 더 열심히 살고 노력해보자. 충분히 할 수 있다.

마지막으로 글또야 잘 부탁해!

📖 AI 트루스

Chanho Lee
다양한 분야를 공부하고 있는 학생
info

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

나는 리뷰어다 2024

Book Info

tip

책 이미지를 클릭하면 교보문고 사이트로 이동합니다!

책

  • 제목: AI 트루스
  • 저자: 임백준
  • 출판사: 한빛미디어
  • 출간: 2024-08-20