c0d3man52

Webサイト制作

HUGO サイトを自動でFTPアップロードするDockerコンテナを作ってみた

ドメインを取得した時に無料でもらえたサーバーがあって、静的サイトだったのでなんかうまく使えないかなぁと思って、HUGOのサイトを自動でFTPしてくれるDockerコンテナを作ってみました。

公開日: 2019.3.11

目標

HUGOで作成したサイトを、毎回FTPクライアントでアップロードするのが面倒なので、コマンド一発で本番データをアップする機能を目指します。

ちなみに、すでに「hugo new」でローカルにHUGOサイトが作成されている前提です。

「Netlifyならレポジトリにアップして終わりじゃん」というご指摘、ごもっともです。

下準備

HUGO&LFTPのコンテナイメージを作る

HUGOとLFTPさえあればOKなので、それらが入ったコンテナイメージを作成します。

Dockerfileは下記のようになりました。

FROM alpine:latest

RUN wget https://github.com/gohugoio/hugo/releases/download/v0.41/hugo_0.41_Linux-64bit.tar.gz
RUN tar -xzf hugo_0.41_Linux-64bit.tar.gz
RUN mv hugo /usr/local/bin/hugo
RUN mkdir -p /hugo

## Install lftp
RUN apk update && apk add lftp

大元のDockerfileは下記のページを参考にさせていただきました。

[Docker] Alpineを使って軽量なHugoイメージ作って見た。 | nyagosu hanten

これにLFTPを足しただけです。

docker build .

でビルドして、

docker tag

で、イメージに「hugo-ftp」という名前をつけました。

lftpの設定ファイルを用意する

LFTPの設定については、下記を参考にさせていただきました。

LFTPでサーバ間でファイル転送をする | Qiita

今回は、Dockerコンテナ内にlftpを内包しているので、ローカルにインストールする必要はありません。

また、レンタルサーバーにFTPする前提なので、FTPユーザー・パスワードは作成済みとして、必要なのは、lftp.datの作成部分です。

lftp.datの中身は下記の通り。

open -u FTPユーザーID,FTPパスワード FTPサーバー
mirror -R --only-newer --verbose=3 --log=lftp.log ./public /
echo end
close
quit

このファイルをHUGOのプロジェクディレクトリ直下においておきます。

実際に使ってみる

さて、いよいよ実行の時です。

hugo newですでにHUGOプロジェクトが出来ている前提で進めます。

実行コマンド

実行コマンドは下記になります。

docker run -w /hugo -v site/:/hugo --rm --name hugo hugo-ftp /bin/bash -c "hugo && lftp -f lftp.dat"

コンソール上にHUGOコマンドとLFTPのコマンドがずらーっと流れて、エラーがでなければOKです。

FTPサーバー側を見てみると、HUGOプロジェクトのpublicディレクトリの中身がそのままコピーされているはずです。

厳密にはミラーリングしているので、ローカルになかったファイルは削除されます。

dockerコマンドの解説すると、、、

docker run  #dockerを実行
  -w /hugo  #ワークスペースをコンテナ内の/hugoにする
  -v site/:/hugo  #ローカルディレクトリをコンテナにマウント
  --rm  #コンテナを実行したら自動削除
  --name hugo  #コンテナ名
  hugo-ftp  #使用するコンテナイメージ
  /bin/bash -c "hugo && lftp -f lftp.dat"  #コンテナ内でhugo && lftpコマンドを実行

という形になります。

最後のコマンドのところで、「hugo = 静的ファイルをジェネレート」して、「lftpコマンドで対象FTPサーバーにミラー」する感じです。


docker runで簡単にHUGOサイトを本番アップロードできました。

これを拡張して、Githubのhookに対応させたり、複数サイトの管理ができるプログラムにしていけば、いろんな静的サイトの管理が楽になりそうですね。