Dockerを使って詰まったところ7選

これでいいのかな

このサーバーはCoreOS+dockerで構築しています。とりあえずレベルで動いているですが一通り作ってみて詰まったところを書き出してみる

timezone

timezoneは初期状態ではUTCです。なのでdateコマンドを使用すると日本時間より9時間ずれます。dockerfileに日本時間を設定してもよいですが、volumeを使用しホストOSのtimezoneと同じにしてます。

:ro(read only)をつけ、ホストOSのtimezoneと動機しかつ書き換えれないようにしています。

PHPの設定ファイルにもtimezoneの設定が必要

コンテナを日本時間に設定し、サイトの時間を見てみるとUTCのままでした。原因はPHPの設定ファイルにtimezoneの設定項目があり、これを設定する必要があるみたいです。

php.iniファイル内にdate.timezoneの項目があります。インストール方法によりコメント化されてたりされていなかったりします。
コメント化されている場合は追記するだけなのでecho、アンコメントの場合はsedコマンドなどにより変更すればよいでしょう。

コンテナの日本語化は不要という結論になった

初期状態では日本語設定をしていないので日本語は文字化けします。

centosの場合以下で日本語化できます。

開発時には日本語化するメリットは十分にありますが、稼働状態になると日本語化する意味が無いような気がします。実稼働ではDockerfileから日本語化処理を削除しています。

Dockerファイル内でsuコマンドは使えない

node.jsをインストールするときnvm経由でインストールしました。そのときに.bash_profileに環境変数を追加する命令を追加し、RUN su -コマンドで再ログインを使用としましたが駄目なようです。
なので&&を使用し1命令し実行しました。

できるだけRUNをまとめる

Dockerは1命令毎にimageの破片?(正式名称がわからん)が作られます。その破片を積み重ねて理想とするコンテナを実現しています。DockerfileのRUNコマンドはたくさん書くことになるでしょう。すべてのRUNをまとめると可読性が落ちるのであるていど役割でまとめた方がよいかと

&&でまとめられます。複数行記載したいときは\を記載します。

Dockerfile内でVOLUMEにファイルを置いても意味ない

永続化の実現のためVOLUMEを使用します。VOLUMEはホストOSもしくはbusyboxに使用することが多いでしょう。たとえばWEBサイトを永続化させようとして、さらにWEBサイトがすでにある場合

一見問題なさそうですが
docker run -it -v /hogehoge:/var/www/html -p 80:80 hoge
を実行した場合、COPYしたindex.htmlはなくなります。正確に言うと/hogehogがvar/www/htmlにmountされているので/hogehoge/index.htmlが存在した場合、そちらが表示されます。

永続化と友達?ENTRYPOINT

ENTRYPOINTの正しい使い方はいまいち理解していませんが、私はVOLUMEディレクトリに対する処理を行うようにしています。ENTRYPOINTで実行するコマンドは自分で作成したシェルスクリプトです。上記のWEBサイトの例でマウントしたところにindex.htmlがあればなにもしない。index.htmlが無ければ作成(コピーする)と言う処理をする場合

だいたいこのようになります。

スポンサーリンク
レタリング(大)広告
レタリング(大)広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レタリング(大)広告