※ 実は上手くいってない点があるので、正確には未完成です。 また、私がDockerとFTPサーバの初心者なので、おそらく無駄とかあります。
コード上だけであれば、FakeFtpServer等のFTPサーバをモックにしてテストする方法はあります。ただし、モックなしの内部での結合試験を行うときには、FTPサーバが必要になります。
そんな時に、できるだけさっくりとDockerでFTPサーバを建てる方法を探しました。その時に苦労した作業メモです。
当たり前ですが、英語を簡単に読めるなら公式ページ見た方がいいです。
この記事読んでわかること概要
分からないこと
- Dockerイメージでの永続化方法
- 開発目的のため調べなかった。実運用は流石に怖い。
- FWで適切なポート開放が必要な環境でのFTPサーバの建て方
- localでは問題ないことは確認済
Dockerイメージ
stilliard/pure-ftpd
公式ページ
Dockerfileとシェル
Dockerfile
ENVで設定してあげれば、ユーザIDやユーザPASSを指定したうえで起動できるので楽ですね。
もし、この設定をしていない場合は、毎回起動したのちにユーザ名やパスワードをコマンドで実行してあげる必要があります。公式ページにも載っていますが、めんどくさいので起動時に指定してあげた方がいいでしょう。
FROM stilliard/pure-ftpd ENV FTP_USER_NAME=system # ユーザID ENV FTP_USER_PASS=pass # ユーザPASS ENV FTP_USER_HOME=/home/ftpusers/system # HOMEディレクトリ CMD /run.sh -c 30 -C 10 -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -j -R -P $PUBLICHOST
シェル
私はdummy-ftpという名前で起動します。上記Dockerfileと同じディレクトリでビルドし、起動します。
21ポートは制御コネクションなので、基本的には必要です。30000-30009はこのDockerイメージのデフォルトのデータコネクションです。
docker stop dummy-ftp docker rm -f dummy-ftp docker rmi -f dummy-ftp docker build -t dummy-ftp -f Dockerfile . docker run --name dummy-ftp -p 21:21 -p 30000-30009:30000-30009 -d -it dummy-ftp
もし、この辺のデータコネクション(PassiveMode)のポートを変更したい場合は、FTP_PASSIVE_PORT と --expose
で指定してあげれば良さそうです。
※ この箇所を全く試せていません。当時、FTPのモードを理解していなかったので環境構築に時間がかかってしまい、検証環境だけFTPするロジックを潰しました。
docker run -e FTP_PASSIVE_PORTS=10000:10009 --expose=10000-10009 -p 21:21 -p 10000-10009:10000-10009
ソースコード
終わりに
正直なところ、相手が用意したFTPサーバをすぐに使用できるのであれば、接続すべきだと考えてます。
どの環境にも言えますが、こちらで用意した環境と相手が用意した環境の想定が違う、ということは多々あります。最近も苦しみました。
とはいえ、高速で自分たちの組織の中で環境構築できるような能力を高めておけば、本番環境に近い状況でテストできるので、こういう技術は身に着けていきたいですね。
もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、Twitterのフォローもよろしくお願いします。私の励みになります。