ようへいの日々精進XP

よかろうもん

Dockerfile で VOLUME を使う際の注意点 〜 VOLUME 指定したパスではファイルを更新出来ない 〜

あけましておめでとうございます

今年も宜しくお願い致します。

tl;dr

WordPress の公式 Docker イメージを利用して Dockerfile を書いていたら、コンテナ内の /var/www/html 以下でファイルの操作が出来なかったので、なぜだろうと思って調べたのでメモしておきます。

Dockerfile

あれーっ

以下のような Dockerfile を書いていました。

FROM wordpress:5.6.0

ADD test.txt /var/www/html/test.txt
RUN echo "xxxxxxxxxxxxxxxxxxxxxxxxx" >> /var/www/html/test.txt

ビルドしてコンテナを起動すると、以下のような結果となることを期待していました。

$ docker build -t docker-sandbox . && echo "-------" && docker run --rm docker-sandbox:latest cat /var/www/html/test.txt
(ビルドの様子)
-------
xxxxxxxxxxxxxxxxxxxxxxxxx

実際に実行してみると、以下のように出力されました。

$ docker build -t docker-sandbox . && echo "-------" && docker run --rm docker-sandbox:latest cat /var/www/html/test.txt
Sending build context to Docker daemon   2.56kB
Step 1/3 : FROM wordpress:5.6.0
 ---> bc5f6567b763
Step 2/3 : ADD test.txt /var/www/html/test.txt
 ---> Using cache
 ---> 271e40aceba6
Step 3/3 : RUN echo "xxxxxxxxxxxxxxxxxxxxxxxxx" >> /var/www/html/test.txt
 ---> Using cache
 ---> 5d26f3ec24c6
Successfully built 5d26f3ec24c6
Successfully tagged docker-sandbox:latest
-------

あれーっと思って、docker history でコマンドのビルド履歴を見てみると、以下のように xxxxxxxxxxxxxxxxxxxxxxxxx の書き込みで SIZE が 0B となっていることに気づきました。

$ docker history docker-sandbox:latest | less
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5d26f3ec24c6        6 minutes ago       /bin/sh -c echo "xxxxxxxxxxxxxxxxxxxxxxxxx" …   0B
271e40aceba6        6 minutes ago       /bin/sh -c #(nop) ADD file:bd8c9270f5699bc59…   0B
bc5f6567b763        2 weeks ago         /bin/sh -c #(nop)  CMD ["apache2-foreground"]   0B
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
()

おお。

なんだろう、/var/www/html ディレクトリに何か特殊なことをしているのだろうか... ということで、WordPress コンテナイメージの Dockerfile を見てみました。

WordPress コンテナイメージの Dockerfile を見てみる

github.com

以下のように、/var/www/html パスが VOLUME 指定されていました。

()
    chmod -R 777 wp-content

VOLUME /var/www/html

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["%%CMD%%"]

ほうほう、VOLUME 指定していると、そのパスは何か特殊なことが起きるようです。

VOLUME を指定すると

ドキュメント

Dockerfile のリファレンスを見てみましょう。

docs.docker.com

Changing the volume from within the Dockerfile

以下のように記述されていました。

If any build steps change the data within the volume after it has been declared, those changes will be discarded.

日本語訳すると、以下の通りです。

ビルドステップでボリューム内のデータが宣言された後に変更された場合、その変更は破棄されます。

なるほど、なるほど。

今回だと、すでに WordPress コンテナをビルドする際に VOLUME /var/www/html が指定されている為、Dockerfile 内で /var/www/html 以下のファイルを操作 (ファイルに文字列を上書き) しようとしても操作が出来なったというオチですね。

完全に理解した... というわけではありません... なぜ、Dockerfile 内で VOLUME を指定した以降、その指定されたパスでの変更が破棄されるのか、その理由を知りたくて、ドキュメントを漁ったり、Docker のソースコード (buildkitmoby) をななめ読みしてみたりしましたが、理由は解らず、自分の Docker 力の無さに凹みました。

とりあえず、今は、これは仕様ということで理解しておきます。

参考

docs.docker.com

docs.docker.com

www.lewuathe.com

2020 年 12 月 31 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット、30 分エアロバイク (負荷 8)) + (35 秒ダッシュ漕ぎ x 5 Rest: 35 秒)
  • 今年最後のエアロバイクだった

おせち

平尾の「しらゆき」にオーダーしていたおせちを受け取りに行く。

www.itaba-sirayuki.com

明日、お酒と一緒にいただくのが楽しみ〜

あっと言う間の。。。

一年だった。

夕飯の後、慌てて振り返りを書くなど。

inokara.hateblo.jp

ということで、今年、一年もお疲れ様でした。

初老丸を支えた技術 2020 〜 2020 年の振りかへりでうちで踊ろう 〜

tl;dr

2020 年を振り返ってみたいと思います。

ちなみに、去年の振り返りの記事は以下の通りです。

inokara.hateblo.jp

コロナウィルス

ただ、不安な毎日しかなかったような気がします。2020 年が始まった時には、まさかこんな一年になるとは思っていませんでした。幸い、家族の中にはウィルスに感染するようなことはなく平穏に過ごせたことに感謝しています。また、このような状況で懸命に医療活動に携わっているすべての皆さんにお礼とエールを贈りたいと思います。

ありがとうございます。

骨粗鬆症

骨粗鬆症って年寄りの病気だと思っていたので、まさか、自分が発症するとは思っていませんでした。

inokara.hateblo.jp

幸い、投薬治療と食事で骨密度の数値はだいぶん回復してきました。

まだまだ投薬治療は続きますが、焦らずに向き合っていこうと思います。

ケガとランニング

今年一年のランニング状況 (ざっくりとした走行距離感) は以下のような感じです。

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

4 月〜 7 月は骨粗鬆症による、胸椎の圧迫骨折、11 月〜現在に至るまで、左足の中足骨あたりを痛めて走れず... という、ケガに見舞われた惨憺たる一年でした。何も言えません、とにかくケガが多い一年でした。

出走したレースは、痛みに我慢して出走した別府大分毎日マラソン、30 キロでリタイヤしました。

inokara.hateblo.jp

第 69 回別府大分毎日マラソン / かっぱさんの活動データ | YAMAP / ヤマップ

10 月に久留米で開催されたオトナの長距離記録会にて、久しぶりにトラックを走りました。5000m でしたが、置き忘れていた青春を取り戻した気持ちになりました。

[ランニング 2020-10-18-夕] 青春を再び、オトナの 5000M タイムトライアル / かっぱさんの活動データ | YAMAP / ヤマップ

そして、11 月には、大濠公園で開催されたフルマラソン大会でも 39 キロ付近でリタイヤしました。

[ランニング 2020-11-1-朝] 今年最後のフルマラソンはリタイヤで終わった (涙 / かっぱさんの活動データ | YAMAP / ヤマップ

こうやってみると、グダグダな一年だったように思えますが、まあ、いいかなって気持ちです。

とりあえず、現在進行系の故障を治すこと。そして、故障が治ったら、ボチボチ走っていこうと思います。

仕事

YAMAP 二年目。素晴らしいメンバーに支えられて走り切ることが出来たと思います。

コロナの影響で、2 月の中盤からはリモートでの業務となりましたが、リモートでも特に不都合なく業務が行えたことは本当に良かったですし、リモートということで、奥さんと一緒に過ごす時間が増えたことは本当に良かったと思います (笑)

反省点として、技術的なインプットやアウトプットが出来なかった一年で、だいぶん世の中から置いていかれた感じがして辛いですが、来年は無理の無い範囲でインプットとアウトプットを増やしていければなあと考えています。

英会話

会社の福利厚生の一環で、レアジョブを使った英会話レッスンを受けさせて頂くことになりました。

自分の英語力は中学一年生で止まっているので、レアジョブのレッスンについていけるか、かなり不安だったのですが、案の定、全くついていくことが出来ずに苦労しています。

ただ、幸い、奥さんが大学時代に英文科だったいうことで、ちょいちょいおかしな文法にツッコミいれてくれたり、自分の拙い英会話に付き合ってくれたりして、少しずつ英語に慣れる努力はしているつもりです。

家族

奥さんが毎日の夕飯のお品書きを毛筆で綴るようになりました。せっかくなので、お品書きを写真に撮ってインスタグラムに掲載したり、ホームページを公開したりしました。

www.hiromi-oshinagaki.com

自分の身内を褒めるのは、ちょっと照れますが、控え目に言っても、奥さんがしたためる文字には力があり、優しさがあり、心が籠もっていると思います。そして、毛筆綴る食事のメニュー、どれもこれも美味しくて、骨粗鬆症を患ってしまった自分の為に、骨の為になるようなメニューを色々と考えて作ってくれて本当に感謝しかありません。

ありがとう。

以上

ということで、そろそろ 2020 年が終わろうとしています。

色々とありましたが、こうやって大晦日を迎えることが出来たのも、一重に奥さんをはじめ、父や母、会社のメンバー等の支えがあったからだと思います。

本当にありがとうございました。

2020 年 12 月 30 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

今日は、英会話らしい英会話は無かった。

寒い

天気予報が言うように、最強寒波が雪を連れてきた。明日はおせち料理を取りに行かないといけないのに。。。

レコード大賞

夕飯

2020 年 12 月 29 日 (🔥)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

今日も 10 分ほど奥さんと、明日の予定について雑談した。

夕飯

二日目のカレー!美味しゅうございました。

仕事納め

とりあえず、一年間、お疲れ様でした。

2020 年 12 月 28 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

10 分ほど奥さんと雑談してみた。まあまあ楽しいので、これからも続けていきたい。

夕飯

2020 年 12 月 27 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

更に今日も英語を喋る機会が無かった。。。

夕飯

今宵も「おでん」。お酒が進む君で美味しゅうございました。

2020 年 12 月 26 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

夕方、以下の通り、久しぶりに走ってみた。

[ランニング 2020-12-26-夕] 走れる喜びを噛み締めて (4) / かっぱさんの活動データ | YAMAP / ヤマップ

痛みはあんまり変わらず。

レアジョブ

今日も英語を喋る機会が無かった。。。

そう言えば

今朝、アクトネルを飲んだ。

一週開けて飲んだせいか、飲んだ直後から倦怠感が強くて夕方まで殆ど横になっていた。

夕飯

実録にっぽん CircleCI ばなし 〜 ジョブを正常中断したい 〜

tl;dr

ジョブを中断したかったので調査したら、リファレンスをちゃんと読め案件でしたが、ここにメモしておきます。

ジョブを正常に中断したい

中断出来ない例

以下のように、正常なステータスで中断したい部分で exit 0 と書いても、最後の test2 まで実行されてしまいます。

version: 2.1

executors:
  default:
    docker:
      - image: 'cimg/python:3.6'

commands:
  command_1:
      steps:
        - run:
            name: Command Test 1
            command: |
              echo 'command 1 test'
              exit 0

jobs:
  command_test:
    executor: default
    steps:
      - checkout
      - command_1
      - run:
          name: test1
          command: |
            echo 'test1'
            exit 0
      - run:
          name: test2
          command: |
            echo 'test2'

workflows:
  version: 2

  command_test:
    jobs:
      - command_test:
          filters:
            branches:
              only:
                - master

f:id:inokara:20201226094041p:plain

ちなみに、exit 1 と書くと、ちゃんと中断してくれますが、今回は「正常なステータス」で終了したいので、要件を満たしていません。

中断する例

以下のように、中断したい箇所に circleci-agent step halt を記載すると、「正常なステータス」で終了することが出来ました。

version: 2.1

executors:
  default:
    docker:
      - image: 'cimg/python:3.6'

commands:
  command_1:
      steps:
        - run:
            name: Command Test 1
            command: |
              echo 'command 1 test'
              circleci-agent step halt

jobs:
  command_test:
    executor: default
    steps:
      - checkout
      - command_1
      - run:
          name: test1
          command: |
            echo 'test1'
            circleci-agent step halt
      - run:
          name: test2
          command: |
            echo 'test2'

workflows:
  version: 2

  command_test:
    jobs:
      - command_test:
          filters:
            branches:
              only:
                - master

f:id:inokara:20201226094106p:plain

これは、リファレンス にちゃんと記載されていました。

f:id:inokara:20201226094241p:plain

以上

メモでした。

2020 年 12 月 25 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

今日も英語を喋る機会が無かった。

出社

12 月になって初めて出社した。多分、今年最後の出社になった。

夕飯