April 7, 2022 • ☕️ 6 min read
docker-compose.yml にて、「tty: true」という記述が何を表しているか今ひとつ掴めなかったので、調べてみた。
What is “tty: true” in docker-compose.yml? | by KeisukeKoshikawa | Medium
https://kossy0701.medium.com/what-is-tty-true-in-docker-compose-yml-47a72891aee2
If you write “tty: true” in the docker-compose.yml, you will be able to “keep the container running”.
docker-compose up -d でコンテナを起動させると、すぐにコンテナは終了してしまう。
コンテナを起動し続けるには、「tty: true」といオプションが必要、という事らしい。
tty は Linux コマンドのそれみたい。
What is tty?
A pseudo terminal (also known as a tty or a pts ) connects a user’s “terminal” with the stdin and stdout stream, commonly (but not necessarily) through a shell such as bash .
… In the case of docker, you’ll often use -t and -i together when you run processes in interactive mode, such as when starting a bash shell.
こっちの説明はシンプル。
tty【コマンド】とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word11668.html
「tty」コマンドはコマンドライン上から接続端末のデバイスファイル名を取得する際に使います。
コンテナを起動させ続けるのにこれが必要な事は分かったけど、何で「標準出力を有効にする」という設定で、コンテナの起動を永続化させるようにしたのか、命令体系が謎だ。
素直に「permanent: true」とかで良かったんじゃ無いだろうか。
「じゃ、コンテナにアクセスするためには(起動してすぐ終了しないようにするためには)、“tty: true” を書いとけばいいのな。」
と思って docker-compose.yml を見てみると、実際にはそんな記述が無くともアクセスできるコンテナがある。
こんな感じで試してみました。
version: "3"
services:
php:
image: php:8.0-fpm
node:
image: node:16-slims
起動コマンド
docker-compose up -d
ログインコマンド
docker-compose exec php bash
docker-compose exec node bash
php の方はアクセスができるが、node の方はアクセスが失敗する。
両方とも「tty: true」を付けていないので、上記の説明が正しいなら、どちらもコンテナ起動と同時にプロセスが終了して、両方ともアクセスできないという挙動になるのでは?
と思ったが、どうやら違うみたい。
というか、nginx や mysql や redis って、「tty: true」が付いてない記述が多い気がする。
調べてみると、こんなのがありました。
docker-composeで tty: true にしてデーモンがいないコンテナを動かし続ける
https://imagawa.hatenadiary.jp/entry/2019/07/31/065830
そういえばmysqlとかredisみたいなデーモンで動かすプロセス作ってないから何も継続する仕事がなくて終わっちゃうんだろうなと思って調べると、 tty: true という設定値をdocker-compose.ymlに書けるらしい。
docker-compose up したコンテナを起動させ続ける方法
https://qiita.com/sekitaka_1214/items/2af73d5dc56c6af8a167
ポート待受とかしていないコンテナをdocker-compose upで起動するとコンテナがすぐ終了してしまうと思います。
コンテナ内に、デーモンが常駐している場合は、docker-compose.yml で余計なことをしなくても起動し続ける、という事らしい。
となると、「 “tty: true” を付けて永続化させる」というのも、正攻法というよりは、ちょっとした迂回路としての回答な気がしている。
コンテナ内に常駐プログラムがある場合、“tty: true” は不要。
そうでない場合は、“tty: true” が必要。
ということで、先程の docker-compose.yml は、node の方は「tty: true」が必要となります。
version: "3"
services:
php:
image: php:8.0-fpm
node:
image: node:16-slims
tty: true
ちなみに、「node:16-slims」は、軽量版 Node.js です。
詳細は、公式をご参照ください。
node:
-slim
This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run node.Unless you are working in an environment where only the node image will be deployed and you have space constraints, we highly recommend using the default image of this repository.
試しに「tty: false」を付けて起動してみました。
docker-compose.yml は、こんな感じです。
version: "3"
services:
php:
image: php:8.0-fpm
tty: false
node:
image: node:16-slim
tty: false
「tty: false」を付けたとてしても、デーモンが常駐しているコンテナの場合、アクセス経路が絶たれるというわけではないみたい。
ここは、「コンテナは起動するけど、起動してすぐに終了する」もしくは「コンテナは起動しているけど、アクセスはできません」という挙動になるのが素直な動きなのでは?
と思わなくもないが、そんな感じでした。
Docker よくわかんねっす。