先日,しん↑かん↓しぇ~ん→で出張する機会がありましたが,暇だったので Web アプリ開発の続きをやろうと思いました.
車内で PC を開いて環境を立ち上げようとすると・・・
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://regist
ry-1.docker.io/v2/library/php/manifests/7.4.16-apache-buster": dial tcp: lookup registry-1.docker.io on 192.168.65.5:53:
no such host
_人人人人人人人人_
> no such host <
 ̄^Y^Y^Y^Y^Y^Y^Y
ひえーそういえばインターネットなかったんだ😱
東海道新幹線に Wi-Fi がついているので接続して使おうとしますが,多数の方が同時に使われるものですので,開発用途で大容量ファイルをダウンロードするのは良くないです.
どうしたらいいでしょうか?
ここからは私が考えた,新幹線車内で起こる問題と対策をご紹介します.
Docker イメージの取得に失敗する
Docker イメージの取得に失敗するのを避けるには,あらかじめ Docker イメージをプルしておきましょう.
PHP + Apache 環境のイメージをプルする例です.
docker pull php:7.4.16-apache-buster
Docker イメージのビルドに失敗する
パッケージのインストールなど,インターネットに接続して処理を行うコマンドを含む場合,ビルドに失敗します.
これもインターネットがないことが原因ですので,あらかじめビルドしておきましょう.
docker build -t php-apache:latest .
起動もあらかじめビルドしたイメージから行います.
docker run --rm -it php-apache:latest
Docker Compose から起動する場合, docker-compose.yaml
は
services:
php-apache:
build:
context: .
dockerfile: dockerfile/php-apache.dockerfile
のように build
を使って書いているところを
services:
php-apache:
image: php-apache:latest
のように image
でビルドしたイメージ名を指定しましょう.
外部ライブラリの読み込みに失敗する
これもインターn(ry
例えば Bootstrap を こちら のように CDN から読み込んでいたのであれば,
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
ダウンロードするか npm や Composer などでインストールして使いましょう.
外部 API の実行に失敗する
これは仕方ない問題だと思います.
API が呼び出せないことでその後の動作に支障が出るのであれば,API に相当する何か別の関数を作ってそれを読み込むといいかもしれません.
PHP + Apache などでローカルにサーバがある場合は,初めからローカルサーバ内の決まった URL にアクセスし,その中で API を呼び出すようにします.
public function get_something()
{
$isオフライン = $this->環境変数('オフラインで利用する');
if ($isオフライン) {
echo '130'; // 固定値やサーバ内部で完結するような関数を呼び出す
exit;
}
// API を呼び出す処理...
}
でも Web 系アプリなら本番環境がインターネットにつながっているのは大前提なので,ソースコードにこんなコードを書くのはやはりおすすめしません・・・
どうやらしん↑かん↓しぇ~ん→ API 関連は永遠の課題になりそうです.もしいいアイデアをお持ちの方がいらっしゃれば教えていただきたく
最後になりましたが,みなさんがどっか (Docker) に行くときにこの記事を読まれて,快適な旅をされることを心よりお祈り申し上げます🚄🙏