1

Тема: завантаження файлу з локального компа в docker що хоститься на VPS

Роздумую над можливістю створення апки на Python, яка б автоматично завантажувала нові файли .CSV на локальному компі в хмару.
Хмара в даному випадку - віртуалка на якій раниться докер контейнер.
Доступ до VPS лише через SSH, всі решта порти закриті.

Можливо що знайду рішення і напишу тут, однак може в когось будуть якісь ідеї.

2

Re: завантаження файлу з локального компа в docker що хоститься на VPS

Поки що такий скрипт, тільки авторизація здійснюється на підставі ssh key. Це лише копіювання файлу в VPS, а не саме в докер контейнер.

import os
import paramiko
from scp import SCPClient
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class CsvHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.src_path.endswith('.csv'):
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect('<VPS IP>', username='<username>', password='<password>')
            scp = SCPClient(ssh.get_transport())
            scp.put(event.src_path, '<destination path on VPS>')
            scp.close()

observer = Observer()
observer.schedule(CsvHandler(), path='<local directory to monitor>', recursive=False)
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()

observer.join()

3 Востаннє редагувалося frz (04.12.2023 14:55:52)

Re: завантаження файлу з локального компа в docker що хоститься на VPS

Копіювання саме в docker контейнер має бути наступною командою docker cp:

import os
import paramiko
from scp import SCPClient
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class CsvHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.src_path.endswith('.csv'):
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect('<VPS IP>', username='<username>', password='<password>')
            scp = SCPClient(ssh.get_transport())
            scp.put(event.src_path, '/tmp')  # temporary location on VPS
            scp.close()
            
            # Copy the file from the temporary location into the Docker container
            stdin, stdout, stderr = ssh.exec_command(f'docker cp /tmp/{os.path.basename(event.src_path)} <container_id>:<destination_path_in_container>')
            print(stdout.read())
            print(stderr.read())

observer = Observer()
observer.schedule(CsvHandler(), path='<local directory to monitor>', recursive=False)
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    observer.stop()

observer.join()