docker-compose로 python file기능을 사용 할 경우 파일안에 데이터가 안남는 상황 해결하는 법

2022. 7. 28. 03:12카테고리 없음

728x90

docker-compose로 파이썬 프로그램을 실행할 때 로그를 파일로 남겨 호스트 머신에 저장하는 기능을 만들려고 했다.

# -*- coding: utf-8 -*-
import os
import sys
import time

#linux
#fileLog = open('/movie_log/test.txt','w')

#windows
fileLog = open('./test.txt','w')

i = 0
while True:
    print(f"test : {i}")
    time.sleep(1)
    i = i + 1
    fileLog.write(f"{i}로그 작성\n")

간단히 무한 루프를 돌면서 sleep(1)을 걸며 로그를 찍는 코드를 짰다(file - close() 함수를 써야 되지만 테스트 용이라 쓰지 않았다)

윈도우에서는 잘 된다.

리눅스로 옮기자 삽질이 시작됐다..


첫 번째 고비

docker-compose로 실행 시 UTF-8을 인식을 못하는 문제가 발생했다.

import locale

print(locale.getdefaultlocale()[1])

로케일 설정을 찍어보니 None이 나온다.. 인터넷에 검색해보니 vi ~/.bash_profile을 연 다음

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

위 환경변수를 세팅 한 다음 source ~/.bash_profile 하라길래 하지 않고(?) 약간 변형해서 docker-compose가 컨테이너 생성 시 참고할 Dockerfile에 위 명령어를 설정했다.(export 명령어는 쓰지 말아야 한다.)

다 한 다음 다시 docker-compose를 실행하니 유니코드 에러는 정상으로 해결됐다.


두 번째 고비 

파이썬은 open함수 후 close함수 호출 전까지 write함수로 파일에 저장한 데이터는 파일을 열어도 저장되어 있지 않다.

인터넷 검색해보니

    fileLog.write(f"{i}log comment\n")
    fileLog.flush()
    os.fsync(fileLog.fileno())

이런 식으로 write함수 다음에 flush 및 os.fsync함수를 호출해야 즉시 파일에 쓴다고 하길래 추가하니 써진다.