うちのいぬ Tech Blog

Tech Blog of Uchinoinu/My dog

Dockerで立ち上げたContainerの挙動に手元のコードの変更を即時反映させる方法

Dockerで立ち上げたContainerの挙動に、手元のコードの変更を即時反映させる方法です。

Volumeを指定してマウントする

version: '3'
services:
  bot:
    image: watashino/image
    tty: true
    volumes:
      - ../:/src # <path in local>:<path in container>
    build:
      context: ..
      dockerfile: ./docker/services/bot/Dockerfile

container側のパスは絶対パスじゃないと怒られました。

docker-compose upをしてもプロセスが終了してしまうことへの対応

基本的には docker はフォアグラウンドでプロセスが走っていれば docker container のプロセスが終了することは無いと思っていたのですが、うまくいかないことがあったのでその対応を書き残しておきます。

tty: true にする

docker-compose.yml

version: '3'
services:
  bot:
    image: watashino/image
    tty: true # make container stay launched
    volumes:
      - ../:/src
    build:
      context: ..
      dockerfile: ./docker/services/bot/Dockerfile

ttyの説明はこちらが詳しいです

でも tty: true を付けているのに、commandを実行するとコンテナが終わってしまう。

bashを対話モードで起動させておく

Dockerfile

CMD bash -c "npm start && /bin/bash"

これによって、プロセスが起動状態のままになりました。

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
3ae0sguc0f2c        watashino/image              "/bin/sh -c 'bash -c…"   28 minutes ago      Up 28 minutes                           bot

Docker Image関連のコマンドの使い方からDockerはどう使うのか雰囲気を知ろうと細かく書き出してみた

対象

  • Dockerは使ってる、使ったことあるし、なんとなく環境も作ったり作らなかったりする
  • やれと言われれば自分一人でもググったりしてなんとか立ち上げられるけど、説明してと言われると言葉に詰まる
  • Dockerについてなんとなく図解することはできるけど、じゃあ実際にどういうコードを書けばいいのか説明にこまる
  • 毎回コマンドをググる、ショートカットで対応しているけど根本的にはわからない
  • (↑主に私です :sweat: )

環境

Screen Shot 2020-03-13 at 15.20.54.png

まずDockerといっても何を使っているのかを知る

$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:22:34 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:29:19 2019
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

ここでわかったのは、Docker Desktopをインストールして使っている際のDockerとは、Docker Engineという仕組みのことをいう様です。そしてDocker EngineにはClientとServerがある様です。 あと、containerはdaemonで動いているんですね(表現があいまいですみません)

Dockerのコマンドにどんなものがあるか知る

Dockerコマンドは、要するにDocker Engineを操作する為のコマンドということです。

$ docker --help

dockerコマンドの基本的な型

Usage:  docker [OPTIONS] COMMAND

普通ですね。

dockerコマンドのオプション

Options:
      --config string      Location of client config files (default "/Users/watashi/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker
                           context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/Users/watashi/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/Users/watashi/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/Users/watashi/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

まだどう使うのかはわかりません。

dockerコマンドで指定できる管理コマンド

Management Commands:
  builder     Manage builds
  checkpoint  Manage checkpoints
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

なんとなく出てきました。 config, container, image, network, service, volume.... なんかDockerの勉強をしていて聞いたことがあるような単語たちですね。

ちなみにこれらはさらに docker system --help みたいな形で中を見ることができる様です。(--helpをつけなくても、同じ出力はみれます)

例: docker systemコマンドの詳細

$ docker system --help
% docker system --help
Usage:  docker system COMMAND

Manage Docker

Commands:
  df          Show docker disk usage
  events      Get real time events from the server
  info        Display system-wide information
  prune       Remove unused data

docker system prune はつい最近使いましたが、全ての停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドです。 停止中unusedすべてのcontainer, volume, network, imagedata と表現しているんですね。 Dockerでは prune はこの様な意味を持って使われているようで、docker system prune 以外にも docker images prune なども出来る様です。

dockerコマンドで指定する操作コマンド(アクション・命令)

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  deploy      Deploy a new stack or update an existing stack
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

build, exec, info, inspect, logs, pause, ps, rename, restart, rm, rmi, run, などなど、使った記憶があるものや、dockerでなくても他のコマンドと一緒に使ったことがある単語が登場しました。 基本的には、よく聞いた事があるようなコマンドたちですね。 めんどくさそうなのが、 rmcontainer を削除し、 rmiimage を削除するというところかなと思いました。

Docker Imageの確認

Docker imageを表示させるためのコマンド

公式ドキュメントはこちら

$ docker images --help

気をつけなくてはいけないのは、docker imagesdocker image は少し意味が違っています。

Command Command Domain コマンドの意味
docker images docker dockerが扱う操作コマンド
docker image docker image docker imageを扱う管理コマンド

些細な意味の違いではありますが、このあたりが意識しておくのは大切かもしれません。

出力例

REPOSITORY                                                               TAG                 IMAGE ID            CREATED             SIZE
${id}.dkr.ecr.${region}.amazonaws.com/${repositoryName}                  8                   b895764be967        11 hours ago        2.82GB
watashino/dockerImage                                                    latest              b3b481eaf996        11 hours ago        2.82GB

使い方

Usage:    docker images [OPTIONS] [REPOSITORY[:TAG]]

ポイントは、repositoryは <repository_name>:<tag> という表記も対応可能ということ。

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show numeric IDs

Docker image の作成(ビルド)

https://docs.docker.com/engine/reference/commandline/build/

使い方を確認

$ docker build <path | url>
$ docker image build <path | url>

docker-compose を使ったビルドについて

dockerを扱うとき、主にビルドするときでしょうか、よく docker compose という機能が利用されます。これは複数のコンテナを管理する為のツールで、 docker-compose.yml という名前の設定ファイルでよく扱われているかと思います。

docker-compose を使ったビルド

$ docker-compose build

下の様なdocker-composeファイルがあれば、 Dockerfileのパスとの関係性上適切なパスで上のコマンドを叩くことでビルドされます。 また、下のコマンドではビルドと起動を一緒に行う事もできます。

$ docker-compose -up --build
version: '3'
services:
  app:
    image: watashino/docker_image
    build:
      context: ..
      dockerfile: ./watashino/Dockerfile
    container_name: container_name

ちなみにこの docker-compose はバージョンによって対応している Docker Engine のバージョンが異なります。なので、Docker Engineのバージョンが古く、docker composeのバージョンが新しかったりすると、書き方的にエラーになったりもします。 バージョンについてはこちら

Docker image を削除

使い方を確認

$ docker image rm --help

Usage:  docker image rm [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Aliases:
  rm, rmi, remove

Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

ポイント

  • imageは複数指定できること。
  • rmではなくrmi, remove などでも代用可能なこと
  • -f で強制削除が可能なこと

使っていないimageを全部一括削除

$ docker image prune
$ docker image rm $(docker images -q)

ポイント

  • prune は使われていないものを削除するといった意味を持っていましたが、ここでも同様でした
  • docker image rm $(docker images -q)docker image rm という操作コマンドの対象に docker images -q で出力される複数のimage idを指定しています

対象の image を削除

$ docker image rm <image id>
$ docker rmi <image id>

どちらでも大丈夫でした。 ここで最初にわかんなかったのが、 対象の指定の仕方は image id ということです。repositoryではありません。 $ docker images を叩くと、何がrepositoryで何がimage idなのかわかります。

一旦終わりに

docker の image に関するコマンドについての備忘録でしたが、分かっている人からしたら当たり前なことかと思います。 でもよく分かっていない人からすると、整理するのに少し役立つかもしれません。

なお、この記事は備忘録になります。自分一人で調べてもわかんないけど、だれかと一緒にやるとぱっと解決策を見つけられたりもしたので、そういう意味も込めてこの記事を残しています。

そこまでDockerを分かっていない人の為のコマンドまとめ(随時更新)

徐々にデータを追加していきます

環境

Dockerそのものがわからんとき

command meaning note
docker --help dockerコマンドの内容

削除したいとき

command meaning note
docker image rm 指定したを削除する 複数のを指定可能(docker image rm ) , docker rmi エイリアス

一括削除したいとき

command meaning parent command note
docker system prune --all 使用されていない Container, Network, Image, Volumeが削除されます docker system
docker image prune 使用されていないImageが削除されます(なにかの都合で残ってしまったデータ、何にも紐付かないデータなどは削除されません) docker image
docker image prune --all 使用されていないImageが削除されます docker image
docker image rm $(docker images -q) 使用されていないImageが削除されます docker image

イメージをビルドしたりし直したりするとき

command meaning parent command note
docker-compose build Docker imageをフォアグラウンドでビルドします。
docker-compose up -d Docker imageが見つからない場合のみビルドしてから起動します。
docker-compose up -d --build Docker imageビルドしてから起動します。

動かしたいとき

command meaning parent command note
docker-compose up -d Docker imageをバックグラウンドでビルドします。イメージが見つからないときはビルドしてから動かします

その他覚えておくと良さそうなワード

word domain meaning examples note
prune 操作系コマンド 使われていない対象を一括削除する docker system prune, docker image prune
-q オプション 表示するデータを絞る docker images -q, docker image rm $(docker images -q)

Apple Watchアプリ(WatchKit App, WatchOS)の実機検証時のトラブルを諸々解消

WatchOS用のアプリケーションを実装している最中のことですが、 当然のように実機検証したくなりました。

実機検証自体は、簡単で 検証したいAppleWatchとPairingしてあるiPhoneをMacにつなぐとXcodeが **「いい感じに認識」** してくれて、Watch Kit AppからRunするだけです。

しかし、いい感じに認識してくれず色々とうまく行かなかった為、コツコツと解消しました。

今回はその備忘録です。

  • Xcode: Version 10.1 (10B61)
  • WatchOS: 5.1.3

問題1

paired device unavailable for development

Apple Watchの実機でアプリの動作検証したかったのですが、👇の様なエラーとなりました。

paired device unavailable for development
paired device unavailable for development

解決方法

以下のことをして解決しました。

  • 開発に使用しているiPhoneと対象のAppleWatchのpairingを切る

    • このとき Suicaの残高が失われます。Apple Payに連携して防ぎましょう 的なアラートが表示され焦りました💦結果、表示される指示の通り行えば問題ありませんでした
  • 再度Pairingを行う

    • 時間がかかります
    • 色々通知が表示されます
  • iPhoneMacを再度つなぎます

    • 「このMacを信頼しますか」といったアラートがAppleWatchにでます
    • 🎉直りました🎉 f:id:susanne:20190321162405p:plain 🎉🎉🎉🎉🎉🎉

問題2

Could not launch....

Watchアプリが立ち上がってくれません。iPhoneを見ても、AppleWatchをみても、動いた形跡もないので、実機転送もできてなさそうでした。 f:id:susanne:20190321162548p:plain

解決方法

普通にエラーダイアログに書いてあるとおりにしましたが、うまくいきませんでした。 なので、 Xcode の再起動 も行いました。 そして直りました。

問題3

The operation couldn’t be completed.

The operation couldn’t be completed. Unable to launch because it has an invalid code signature, inadequate entitlements or its profile has not been explicitly trusted by the user. 👆のエラーがでました👇

f:id:susanne:20190321162939p:plain

解決方法

Apple Watchの画面を見てみると、対象のアプリケーションは転送されているようでした。iPhoneも同様。 Apple Watchでアプリを立ち上げてみると、 信頼していないdeveloper ~~ を信頼してこのApple WatchでAppを実行しますか?のダイアログが表示され、信頼するボタンをタップしました。 🎉すると起動しました🎉

まとめ

久しぶりにブログを書いたのですが、ほんと基本的な内容になりました。 こういった内容の記事はすぐに古くなるのですが、実行した環境や日付と一緒に備忘録として残しておくのはいいかもしれないって改めて思いました。

【進路】国連や国際機関で働く為の道筋

大学に入る前くらいから、いつか国連で働いて国際社会の安定のために後継するんだ、と思っていたことをふと思い出しました。

でも大学在学中に、色々起きて、それどころではなくなって、いつしかこの思いも忘れてしまいました。

最近ふとしたことから国連で働くことについて思い出したので、 どうしたら働けるのか、簡単に調べてみました。

まずはどんなポストがあるのかチェック

UN Careers

なにはともあれここですね。 実際の国連事務局での募集情報になります。

次に日本国籍保有者なら外務省 国際機関人事センター

www.mofa-irc.go.jp

そこにはこんなpdfがあったりして、いろんな情報が掲載されています。

http://www.mofa-irc.go.jp/dl-data/UN_brochure.pdf

twitterとかもありました

twitter.com

www.facebook.com

これらを見てみると、『国際機関』で働くには、思っていたよりもたくさんのポストがあり、可能性が示されているんだなぁと思いました。

わりと大学生にとっては、チャンスは多い印象を受けました。

国連事務局への道筋

国連事務局ヤング・プロフェッショナル・プログラム(YPP)試験への応募

これは、国連事務局若手職員を採用するための試験の様です。 募集対象は毎年異なるとのことです。

ちなみに2018年6月13日現在では募集中の様です。 www.mofa-irc.go.jp

https://hr.un.org/sites/hr.un.org/files/YPP%202018%20Flyer-English%20%28June%202018%29_final_0.pdf

ジュニア・プロフェッショナル・オフィサー(JPO)派遣制度への応募

日本外務省が行っているプログラムです。 将来的に国際機関で勤務する正規の職員を志望する若手の日本人の方を対象に、国際機関の正規職員となるために必要な知識・経験を積んで頂く機会を提供する目的で、派遣に係る経費を負担し、一定期間(原則2年間)各国際機関へ職員として派遣するようです。

空きポストを待つ

UN Careers

国連を含めた国際機関の場合

空きポスト情報が日本外務省で公開されています。 www.mofa-irc.go.jp

ポストが空いたらメールをくれるサービスもあるようです。 www.mofa-irc.go.jp

また、FAOやOECDなど若手向けの採用試験を実施している国際機関があるようです。

http://www.fao.org/employment/vacancies/junior-professional-programme/en/

www.oecd.org

条件について

他の様々な求人情報と同じ様に、色々な条件が設定されています。 ほとんどの募集にはビジネスレベルで英語が使いこなせる条件がついています。

他にも、学位、専門分野、経験などがあります。

また、つらい条件として、年齢と項目があるものもあります。 このへんはどうにかならないのでしょうかね。

最後に

以上、簡単に国連・国際機関で働く道筋を簡単にまとめました。 もちろん他にもルートはあると思います。 国際機関は公共機関であることがほとんどの様です。(当たり前なのかな) なので、日本のお硬い組織へのエントリーに似ているのかなと想像しましたが、実際に経験したことがないので定かではありません。

ちなみに、昔実際にお勤めされている方からお話を聞いたときは、割とシビアな世界でしたが、 ハイレベルな専門職になると、様子も違ってくるようでした。

なにはともあれ、自分に英語とそれ以外の専門性をつけることが求められるようですね。

【本】ケビン・クルーズ, Kevin Kruse 著 - 1440分の使い方 ──成功者たちの時間管理15の秘訣 (まだ途中です)

今日読んだ本です。まだ読み切れていません・・・ 経過時間: 25分

1440分の使い方 ──成功者たちの時間管理15の秘訣

学んだこと

言葉たち

  • 大成功した人は、時間のことは対して木にしておらず、価値や優先順位、継続的な習慣を重視している
  • 1日は1440分、1分の可能性を思い出そう
  • 最も重要なtask(MIT: Most Important Task)
  • 最も認知能力が高まる朝の二時間は、想定外の用事や緊急事態が発生しにくい時間帯でもある

先延ばし癖について

原因

克服法

  • Time Travel
    • 妥協した未来の自分を想像して、彼らと戦う
  • 報酬と代償
    • 達成した場合に得られるいい思いと、行わなかった際に苛まれる嫌な思いを想像する
  • 説明責任を果たす相手を設定する
    • 一人でやるより、誰かと一緒に行うことで、達成への意欲や責任感が増す
  • なりきる
    • なりたい存在になりきる
    • 彼らならこうする・こうしないということに沿わないと違和感を覚える抑制効果
    • 徹底的になりきる

自分に活かせること

  • ToDo Listをやめて、あらゆることを具体的にスケジュール表に入れ、それだけを厳格に守る
    • 時間がかかるtaskとすぐ終わるtaskなどが並列に扱われるので、結局MITにたどり着かない
    • "The Busy Person's Guide to the Done List"出典による研究結果として、「ToDoリストの項目の41%は永遠に終わらない」と出ている
    • 未完了taskを持ち歩くストレス
    • Time Blocking
      • 重要なことはすべてやる時間をきめて、スケジュール表にいれる
      • スケジュール表にないものはやらない
    • 重要なことほど一日のうちできるだけ早い時間帯に割り当てる

紹介

Kindle

1440分の使い方 ──成功者たちの時間管理15の秘訣

書籍

1440分の使い方 ──成功者たちの時間管理15の秘訣 (フェニックスシリーズ)

楽天

読み上げもあるんですね


≪AI朗読≫1440分の使い方──成功者たちの時間管理15の秘訣

メンタリストのDaiGoさんの動画だと

www.youtube.com

www.nicovideo.jp

最後に

最近習慣が崩れていてうまくできないことが多かったので、インプットの時間が特に遅くなってしまった感じがします。習慣にすることを繰り返してやろうと思います。