Python не может найти файлы в облаке Google, запущенном в рабочей среде

#python-3.x #flask #google-cloud-platform #google-cloud-run

#python-3.x #flask #google-cloud-platform #google-cloud-run

Вопрос:

Я извлекаю данные из API, сохраняю и преобразую их локально. Он работал локально на моем компьютере с Windows с помощью docker, но не в рабочей среде при запуске в облаке. Я действительно не знаю, почему это происходит.

app.py

 ...

try:
    os.mkdir(os.path.join(os.getcwd(), 'tmp'))
    os.mkdir(os.path.join(os.getcwd(), 'tmp', 'cpc'))
    os.mkdir(os.path.join(os.getcwd(), 'tmp', 'cpc', 'fin'))
    os.mkdir(os.path.join(os.getcwd(), 'tmp', 'cpc', 'raw'))
    os.mkdir(os.path.join(os.getcwd(), 'tmp', 'raw'))
    os.mkdir(os.path.join(os.getcwd(), 'tmp', 'transformed'))
except:
    print ("Creation of the directory failed")

...

loader.to_json(qcdp_final, os.path.join(os.getcwd(), 'tmp', 'raw', f'{last_week_monday}.json'))

...
  

load.py

 ...

def to_json(self, data, filename):
    self.data = data
    self.filename = filename
    with open(self.filename, 'w') as outfile:
        for row in self.data:
            json.dump(row, outfile)
            outfile.write('n')
    outfile.close()

...
  

Stacktrace

 FileNotFoundError: [Errno 2] No such file or directory: '/tmp/raw/2020-09-07.json'
at to_json (load.py:44)
at download_data_from_api (extract.py:51)
at main (app.py:39)
at dispatch_request (/usr/local/lib/python3.8/site-packages/flask/app.py:1935)
at full_dispatch_request (/usr/local/lib/python3.8/site-packages/flask/app.py:1949)
at reraise (/usr/local/lib/python3.8/site-packages/flask/_compat.py:39)
at handle_user_exception (/usr/local/lib/python3.8/site-packages/flask/app.py:1820)
at full_dispatch_request (/usr/local/lib/python3.8/site-packages/flask/app.py:1951)
at wsgi_app (/usr/local/lib/python3.8/site-packages/flask/app.py:2446)

  

Ответ №1:

В системах Linux запрещено создавать папки, подобные /tmp . Это зарезервировано для ОС. Я указываю рабочий каталог в своем Dockerfile следующим образом WORKDIR /app , и в этом каталоге я создаю tmp папку. Это делает свое дело.

Ответ №2:

/tmp Не гарантируется сохранение каталога между экземплярами контейнера. Если вы хотите, чтобы файлы были частью образа docker, вам нужно поместить их в другое место.