はじめに
M1 Macに乗り換えて開発を進めようとしたら、Intel版 Macなら動いたDockerイメージのコンテナを立ち上げると、以下のエラーが出た
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
解決策
ENTRYKITを使わずにENTRYPOINTを用いて外部コマンドを使うようにする
修正前
Dockerfile
ENTRYPOINT [ \
"prehook", "yarn install", "--" \
]
修正後
Dockerfile
ENTRYPOINT ["sh", "./entrypoint.sh" ]
./entrypoint.shを作成して
#!/bin/bash
yarn install
exec "$@"
解説
Entrykitとは
Entrykit は一言でいうと、コンテナ内のプロセス起動時に便利な軽量 init システムだ。Docker の起動コマンドに Entrykit を使うと、起動時にテンプレートファイルを元に設定ファイルをレンダリングしてくれたり、メインプロセスの前にコマンドを実行できたりする。
だそうです。なるほど。
また、どうやらENTRYPOINTがentrykitの実行部分であること、entrykitにはコマンドが4つあるということがわかった。
コマンド | 実行内容 |
---|---|
prehook | コンテナ起動時にコマンドを実行する |
render | テンプレート化したファイルに記載されている変数部分を動的に変更する |
switch | コンテナ起動時に実行できるコマンドを複数用意し 切り替えられるようにする |
codep | 複数のプロセスを並列実行する |
なぜEntrykitはダメなのか
downloadしてくるものはx86_64(amd64)向けのものらしく、M1(arm64)では動かなかった。っぽい