Почему JSON-файл не создаётся с помощью Python в среде Docker?

Здравствуйте! У меня есть рабочий код, который создает JSON файл, однако он функционирует только на обычном ПК и не работает в Docker. В Docker код не выдает ошибок, но файл не создается, и соответственно JSON не появляется в каталоге WORKDIR /app, где он, по идее, должен находиться. Вот мой код на Python: <br/> <pre><code class="python">json_data = {"name": "John", "age": 30, "city": "New York"}
      file_path = "my_data.json" 
      with open(file_path, 'w') as f:
          f.write(str(json_data))
          print("Файл сохранен")</code></pre> <br/> Вот Dockerfile: <br/> <pre><code>FROM python:alpine

WORKDIR /app

RUN pip install psycopg2-binary

COPY . .

CMD [ "python", "main_postgresql.py" ]</code></pre> <br/> И docker-compose.yaml: <br/> <pre><code>services:
  app:
    build: ./app

  db_auth:
    container_name: db_auth
    ports:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=admin
      - POSTGRES_DB=postgres
    image: postgres:12.22</code></pre> <br/> <br/> Я запускаю Docker командой: <br/> <code class="bash">docker-compose up</code> <br/> В консоли ошибки нет, и выводится сообщение "Файл сохранен". Спасибо за внимание!
  • 7 декабря 2024 г. 12:43
Ответы на вопрос 3
Здравствуйте!

Судя по вашему коду и предоставленным файлам, вы правильно сделали, что находитесь в рабочем каталоге `/app` в контейнере Docker. Но есть несколько возможных причин, почему JSON-файл может не создаваться или не сохраняться так, как вы ожидаете.

Вот несколько шагов для устранения неполадок:

1. **Проверка кода**:
   Убедитесь, что ваш код действительно вызывается и выполнен. Для этого добавьте больше отладочной информации (например, перед обычной записью в файл) и убедитесь, что код выполняется без ошибок.

   ```python
   import json

   json_data = {"name": "John", "age": 30, "city": "New York"}
   file_path = "my_data.json" 
   print("Начало записи в файл...")
   with open(file_path, 'w') as f:
       json.dump(json_data, f)  # Используем json.dump для корректной записи JSON
       print("Файл сохранен")
   ```

2. **Проверьте, где ищете файл**:
   Убедитесь, что вы ищете файл `my_data.json` в правильном месте. После запуска `docker-compose up` используйте команду, чтобы зайти в контейнер и посмотреть, есть ли там файл:

   ```bash
   docker exec -it <имя_вашего_контейнера> sh
   ls -l /app
   ```

   Замените `<имя_вашего_контейнера>` на имя вашего контейнера, который содержит приложение (`app`).

3. **Обратите внимание на разрешения**:
   Иногда может быть проблема с разрешениями на запись в файл. Убедитесь, что контейнер и папки, в которые вы записываете, имеют правильные разрешения. Вы можете попробовать запустить контейнер с пользователем root, добавив следующую строку в ваш Dockerfile:

   ```dockerfile
   USER root
   ```

4. **Проверка локальной файловой системы**:
   Если вы хотите сохранить файл на локальной файловой системе (например, на вашем ПК), используйте привязку каталогов в `docker-compose.yaml` для монтирования директории:

   ```yaml
   services:
     app:
       build: ./app
       volumes:
         - ./data:/app/data  # Монтирование локальной папки для сохранения файлов
   ```

   Затем измените путь к файлу в вашем коде:

   ```python
   file_path = "data/my_data.json" 
   ```

   Убедитесь, что директория `data` существует на вашем хосте.

5. **Логирование ошибок**:
   Добавьте обработку исключений, чтобы поймать любые возможные ошибки при работе с файлами:

   ```python
   try:
       with open(file_path, 'w') as f:
           json.dump(json_data, f)
           print("Файл сохранен")
   except Exception as e:
       print(f"Ошибка при записи файла: {e}")
   ```

Попробуйте указанные шаги, и это должно помочь вам выяснить, почему файл не создается в вашем случае. Если проблема не решится, пожалуйста, дайте знать, предоставив дополнительные данные о том, что происходит, и я постараюсь помочь!
А где ты файл-то создаёшь? На подмонтированном volume? Или где попало? 
Вообще изменения в файловой системе контейнера не сохраняются при остановке. Тебе нужен volume (или иной похожий механизм), чтобы сохранить данные между перезапусками контейнера.
Читай про docker persistence .
Судя по фразе 
и так же не появляется WORKDIR /app где по идеи и должен появится json
вы ожидаете, что папка и файл появятся в той же директории, откуда происходит запуск. Вот только и папка и файл создадутся внутри контейнера. Можете подключиться через docker exec -it и посмотреть на них (и даже скопировать), но лучше примонтировать, что уже описано в совете выше.
Похожие вопросы