きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

【FTP】FTPサーバをDockerで用意する(stilliard/pure-ftpd)

※ 実は上手くいってない点があるので、正確には未完成です。 また、私がDockerとFTPサーバの初心者なので、おそらく無駄とかあります。


コード上だけであれば、FakeFtpServer等のFTPサーバをモックにしてテストする方法はあります。ただし、モックなしの内部での結合試験を行うときには、FTPサーバが必要になります。

そんな時に、できるだけさっくりとDockerでFTPサーバを建てる方法を探しました。その時に苦労した作業メモです。


当たり前ですが、英語を簡単に読めるなら公式ページ見た方がいいです。

この記事読んでわかること概要

  • DockerでFTPサーバを建てる
  • ユーザ/パスワード/ホームディレクトリを設定する方法

分からないこと

  • Dockerイメージでの永続化方法
    • 開発目的のため調べなかった。実運用は流石に怖い。
  • FWで適切なポート開放が必要な環境でのFTPサーバの建て方
    • localでは問題ないことは確認済

Dockerイメージ

stilliard/pure-ftpd

公式ページ

hub.docker.com

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

ソースコード

github.com

終わりに

正直なところ、相手が用意したFTPサーバをすぐに使用できるのであれば、接続すべきだと考えてます。

どの環境にも言えますが、こちらで用意した環境と相手が用意した環境の想定が違う、ということは多々あります。最近も苦しみました。

とはいえ、高速で自分たちの組織の中で環境構築できるような能力を高めておけば、本番環境に近い状況でテストできるので、こういう技術は身に着けていきたいですね。


もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、Twitterのフォローもよろしくお願いします。私の励みになります。

類似記事

nainaistar.hatenablog.com