Задать вопрос
@DannYLook
Программист

Почему json файл не создается через python в docker?

Приветствую! У меня есть рабочий код по созданию json файла, который к сожалению работает только на обычном пк, а не в docker. Там он не выдает ошибку, а просто не создаёт файл, и так же не появляется WORKDIR /app где по идеи и должен появится json. Код 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("Файл сохранен")

Dockerfile:
FROM python:alpine

WORKDIR /app

RUN pip install psycopg2-binary

COPY . .

CMD [ "python", "main_postgresql.py" ]

docker-compose.yaml:
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


Запускаю docker командой:
docker-compose up
В console ошибки нет и написано Файл сохранен. Спасибо за внимание!
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@mikebelly
Оба автора выше правы, я упрощу вам задачу еще более того.
Теория для размышлений: представьте, что докер создает внутри вашего ПК еще один пк (виртуальное окружение), копирует ваш код в "свой" ПК и там его крутит, там же и создает нужный вам файл. Когда вы контейнер удаляете (docker compose down, например), то удаляется и тот самый ПК докера, включая все файлы, что там лежали (и ваш тоже, и весь скопированный код и тд)

Практика: существует такая вещь как Volumes в Docker, подробнее тут:
docker volumes
Опять же представим, что докер создал отдельный ПК с вашим кодом, что он делает с Volume? Volume - это для "ПК внутри докера" как облачное хранилище (облако в данном случае это ваш ПК и есть)
Внутри этого Volume лежат различные файлы, к которым докер имеет доступ "извне", то есть со своей вм может обращаться к ним
Волюмом можно сделать как отдельный файл, так и папку, способов создания масса, но тк вы начинающий, предлагаю начать со следующих строк:

db_auth:
    container_name: db_auth
    ports:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=admin
      - POSTGRES_DB=postgres
    image: postgres:12.22
    volumes:
      -<path_to_file_or_directory>:<path_to_file_or_directory>


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

Войдите, чтобы написать ответ

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽