かきノート

【Docker】docker-compose.yml にて「tty: true」が必要な場合と不要な場合

April 7, 2022 • ☕️ 6 min read

docker-compose.yml の「tty: true」について

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” が無くともアクセスできるコンテナ

「じゃ、コンテナにアクセスするためには(起動してすぐ終了しないようにするためには)、“tty: true” を書いとけばいいのな。」
と思って docker-compose.yml を見てみると、実際にはそんな記述が無くともアクセスできるコンテナがある。

こんな感じで試してみました。

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」が付いてない記述が多い気がする。

“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」が必要となります。

docker-compose.yml

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 は、こんな感じです。

docker-compose.yml

version: "3"

services:
  php:
    image: php:8.0-fpm
    tty: false

  node:
    image: node:16-slim
    tty: false

結果

  • php - アクセス可
  • node - アクセス不可

「tty: false」を付けたとてしても、デーモンが常駐しているコンテナの場合、アクセス経路が絶たれるというわけではないみたい。

ここは、「コンテナは起動するけど、起動してすぐに終了する」もしくは「コンテナは起動しているけど、アクセスはできません」という挙動になるのが素直な動きなのでは?
と思わなくもないが、そんな感じでした。

Docker よくわかんねっす。


Relative Posts:

【Amazon Linux】 PhpRedis のインストールに凄まじくハマった(Docker編)

April 21, 2022

オープンソースアプリケーションのテーブル設計書を出力して遊んでみよう!:Laracom編

May 5, 2021

福岡の物流エンジニアが、七転び八起きしたあと九回転び、寝っ転がったまま何かやってる事を垂れ流しているブログ

RotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-icon