TIL | 인트라넷에서 소스코드 수정하고 빌드

Yeseul Han·2024년 9월 24일
1

🌞 시작하는 글

에러 짱 많이 고쳤다. 한예슬짱👍

🎯 오늘의 TODO LIST

[✔️] 신한 서버 api 연결
[✔️] 현대 NER
[✔️] DocTransformer 소스코드 찾기

⚗️ 오늘의 실험

서버 출력 문제

  • 에러가 났는데 400 이라고만 뜨고, 아무런 로그가 안뜸 print 문도 안 찍힘
  • print() 출력이 WSGI 또는 ASGI 서버(예: gunicorn, uwsgi, daphne)에서 제대로 표시되지 않는 경우가 있다. 이 경우, 서버가 표준 출력을 리디렉션할 수 있기 때문.
  • 파이썬의 print()는 내부적으로 버퍼링을 사용할 수 있다. 이를 해제하려면 flush=True 옵션을 추가하여 강제로 버퍼를 비울 수 있다.
    `

OSError: [Errno 36] file name too long

  • 업로드된 파일을 받는 post views.py api 함수에서 request.FILES 를 받는 순간 부터 file name too long 에러가 남

  • os 자체에서 파일 이름 크기가 지정되었을 수 있음, os 세팅 자체는 바꾸기 힘드니까 강제적으로 파일명을 변경 시켜야함

  • 파일이 너무 클 경우 지정된 이름을 사용하는 핸들러 작성

from django.core.files.uploadhandler import FileUploadHandler
import os
import uuid

class CustomFileUploadHandler(FileUploadHandler):
    def new_file(self, field_name, file_name, content_type, content_length, charset=None, content_type_extra=None):
        # 파일 이름이 너무 긴 경우 처리
        if len(file_name) > 255:  # 일반적으로 파일 이름 제한은 255자
            _, file_extension = os.path.splitext(file_name)
            # UUID로 파일 이름을 대체하여 너무 긴 파일 이름을 줄임
            file_name = f"{uuid.uuid4()}{file_extension}"

        # 새로운 파일 이름으로 설정한 후 기본 처리
        super().new_file(field_name, file_name, content_type, content_length, charset, content_type_extra)

    def receive_data_chunk(self, raw_data, start):
        return raw_data

    def file_complete(self, file_size):
        return None
  • request.FILES 를 부르기 전에 CustomFileUploadHandler 를 적용하면 적용됨
from django.http import HttpResponse
from .handlers import CustomFileUploadHandler

def upload_file_view(request):
    if request.method == 'POST':
        # 커스텀 파일 업로드 핸들러를 추가하여 파일 이름을 처리
        request.upload_handlers.insert(0, CustomFileUploadHandler())

        if 'file' in request.FILES:
            uploaded_file = request.FILES['file']
            # 파일이 정상적으로 처리되었는지 확인
            return HttpResponse(f"File uploaded successfully: {uploaded_file.name}")
    
    return render(request, 'upload.html')

인트라넷에서 빌드가 안되는 이슈1 : 기존 이미지 불러오기

이슈상황: 인트라넷에 작동하는 A 도커 이미지, 컨테이너, 소스코드가 있음. 근데 소스코드를 수정하고 다시 빌드를 하려고 했더니 인터넷 연결이 차단이 되어 있어서 안됨.
해결:

  • 기존 도커 이미지를 save: docker save -o existing_image.tar <이미지이름>

  • 도커 파일 수정 기본 이미지로 불러온뒤 수정된 소스코드를 copy 해서 빌드하는 도커파일을 생성

# 기존 이미지에서 시작
FROM <기존 이미지 이름>

# 작업 디렉터리 설정 (예시로 /app 디렉터리 설정)
WORKDIR /app

# 수정된 소스코드를 컨테이너 내부로 복사
COPY ./back /app

# 기본 명령어 설정: Django 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

인트라넷에서 빌드가 안되는 이슈2 : docker commit

  • 도커 커밋은 실행중이거나 중지된 컨테이너의 상태를 새 이미지로 저장하는 명령어.
  • vim이 도커 컨테이너 안에 설치되었을시 docker exec -it <컨테이너id> /bin/bash로 들어가서 수정사항을 vim 명령어로 입력 및 저장한다.
  • 해당 도커 컨테이너를 커밋 저장한다: docker commit <컨테이너id> <new image name>
  • docker compose down
  • docker compose up

docker sbom(Software Bill of Materials)

  • 소프트웨어에 포함된 모든 구성 요소, 즉 라이브러리, 패키지, 모듈 등의 목록을 명세한 문서.
  • https://docs.docker.com/scout/how-tos/view-create-sboms/
  • curl -fsSL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh -o install-scout.sh sh install-scout.sh
    docker scout sbom <이미지id>
profile
코딩 잘하고 싶다

0개의 댓글