LoginSignup
5
2

More than 1 year has passed since last update.

オフラインで Docker 環境下の開発を行うときに困ったこと(Web アプリ版)

Last updated at Posted at 2021-12-21

先日,しん↑かん↓しぇ~ん→で出張する機会がありましたが,暇だったので 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 などでインストールして使いましょう.

Bootstrap のダウンロードページ

外部 API の実行に失敗する

これは仕方ない問題だと思います.

API が呼び出せないことでその後の動作に支障が出るのであれば,API に相当する何か別の関数を作ってそれを読み込むといいかもしれません.

PHP + Apache などでローカルにサーバがある場合は,初めからローカルサーバ内の決まった URL にアクセスし,その中で API を呼び出すようにします.

public function get_something()
{
    $isオフライン = $this->環境変数('オフラインで利用する');
    if ($isオフライン) {
        echo '130'; // 固定値やサーバ内部で完結するような関数を呼び出す
        exit;
    }

    // API を呼び出す処理...
}

でも Web 系アプリなら本番環境がインターネットにつながっているのは大前提なので,ソースコードにこんなコードを書くのはやはりおすすめしません・・・
どうやらしん↑かん↓しぇ~ん→ API 関連は永遠の課題になりそうです.もしいいアイデアをお持ちの方がいらっしゃれば教えていただきたく:pray:


最後になりましたが,みなさんがどっか (Docker) に行くときにこの記事を読まれて,快適な旅をされることを心よりお祈り申し上げます🚄🙏

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2