はじめに
PC1台でftplibの動作を確認したときのメモです。
dockerを使用してFTPサーバを作成し、ローカルのディレクトリとdockerコンテナ内のディレクトリでファイルのやり取りをすることを目的とします。
環境
- MacBook Pro
- プロセッサ:1.4 GHz クアッドコアIntel Core i5
- メモリ:16 GB
dockerの準備
作業用のディレクトリを作成し、その中にdocker-compose.ymlを作成する。下記のサイトを参考に作成する。
https://github.com/stilliard/docker-pure-ftpd/tree/master
version: '3'
services:
ftpd_server:
image: stilliard/pure-ftpd
container_name: pure-ftpd
ports:
- "21:21"
- "30000-30009:30000-30009"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: testuser
FTP_USER_PASS: password
FTP_USER_HOME: /home/testuser
restart: always
送信するファイルなどの準備
送信するファイルなどを準備する。
ローカルPC
ftp-testというディレクトリを作成し、この中に必要なファイルを作成する。
ftp-test ____ docker-compose.yml
|__ put-test.txt
dockerコンテナ
/home/testuser下に必要なファイルを作成する。
testuser ___ get-test.txt
ftplibの動作確認
下記コマンドでdockerコンテナの作成&起動を行う。
cd ftp-test
docker compose up -d
接続
pythonで下記を実行し、ホストに接続
パラメータはdocker-compose.ymlに設定したもの
from ftplib import FTP
ftp = FTP(host='localhost', user='testuser', passwd='password')
ディレクトリの中身を取得
下記コマンドを実行すると、コンテナの/home/testuserディレクトリ下のファイルやフォルダを見ることができる。
ftp.retrlines('LIST')
-rw-r--r-- 1 0 0 9 Nov 28 14:02 get-test.txt
'226-Options: -l \n226 1 matches total'
コンテナにあるファイルをPCにコピー
下記コマンドを実行すると、コンテナにあるget-test.txtをPCのftp-test下にget-test2.txtとして保存することができる。
with open('get-test2.txt', 'wb') as f:
ftp.retrbinary('RETR get-test.txt', f.write)
'226-File successfully transferred\n226 0.000 seconds (measured here), 42.03 Kbytes per second'
PCにあるファイルをコンテナにコピー
下記コマンドを実行すると、PCにあるput-test.txtをコンテナの/home/testuser下にput-test2.txtとして保存することができる。
with open('put-test.txt', 'rb') as f:
ftp.storbinary('STOR put-test2.txt', f)
'226-File successfully transferred\n226 0.001 seconds (measured here), 8.00 Kbytes per second'
ftp.retrlines('LIST')を実行すると、コンテナ内にput-test2.txtとして保存されていることを確認することができる。
ftp.retrlines('LIST')
-rw-r--r-- 1 0 0 9 Nov 28 14:02 get-test.txt
-rw-r--r-- 1 1000 ftpgroup 8 Nov 28 14:24 put-test2.txt
'226-Options: -l \n226 2 matches total'
dockerの停止
下記コマンドでコンテナの停止&イメージの削除を行う。
docker compose down --rmi all
おわりに
手元にあるPCで完結できてよかったです。
公式ドキュメントにもっと使用例とか載せて欲しい。。。