docker-composeでtty:trueを指定してコンテナを立ち上げっぱなしにする

コンテナを起動し続けるために適当なループするコマンドをシェルで実行したり、無意味にWebサーバーを立ち上げたりしていたが、docker-compose.yml にtty:trueと書くことで起動させっぱなしにできるようです。

version: '3.5'

services:
  app:
    image: ubuntu
    tty: true

docker psとすれば生き続けている事がわかり、docker-compose exec app bashで入れます。

Dockerコンテナ内でpipを使ってパッケージをインストールしようしたら名前解決できない場合の対策

変な環境で変なDockerコンテナを立ち上げてpipでパッケージをインストールしようとしたら

pip install hogehoge

下記の様に言われた

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by...

ちまちま調べたら名前解決がダメらしかった。仕方ないので自分でDNSを設定してあげます。

echo "nameserver 8.8.8.8" >> /etc/resolv.conf

これで解決。同じような問題の人がちょこちょこいるみたいでした。変な環境のせいだと思ってた。

https://qiita.com/tatamiya/items/d40dab5bb7b23be3548f

Alpine LinuxでShellを実行する

dockerコンテナ起動時にbash -cで処理を実行することがあるが、Alpine Linuxではashを使用する。

$ docker run --rm -ti alpine ash
/ # ls -la
total 64
drwxr-xr-x    1 root     root          4096 Jul 30 07:28 .
drwxr-xr-x    1 root     root          4096 Jul 30 07:28 ..
-rwxr-xr-x    1 root     root             0 Jul 30 07:28 .dockerenv
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 bin
drwxr-xr-x    5 root     root           360 Jul 30 07:28 dev
drwxr-xr-x    1 root     root          4096 Jul 30 07:28 etc
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 home
drwxr-xr-x    5 root     root          4096 Jul 11 17:29 lib
drwxr-xr-x    5 root     root          4096 Jul 11 17:29 media
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 mnt
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 opt
dr-xr-xr-x  375 root     root             0 Jul 30 07:28 proc
drwx------    1 root     root          4096 Jul 30 07:28 root
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 run
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 sbin
drwxr-xr-x    2 root     root          4096 Jul 11 17:29 srv
dr-xr-xr-x   13 root     root             0 Jul 30 07:28 sys
drwxrwxrwt    2 root     root          4096 Jul 11 17:29 tmp
drwxr-xr-x    7 root     root          4096 Jul 11 17:29 usr
drwxr-xr-x   11 root     root          4096 Jul 11 17:29 var

PythonでWebサーバーを立ち上げる

python3 -m http.server 8080 でサーバーを立ち上げることができる。下記で立ち上げると http://localhost:8080 からアクセスできるようになります。

$ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [30/Jul/2019 16:06:57] "GET / HTTP/1.1" 200 -

静的ファイルを確認する際などに役立つ。

docker-compose.yml の中で環境変数を展開する

下記のようにして環境変数を展開することができる。

version: '3.5'
services:
app:
build:
network: host
context: ./
environment:
APP_MODE: ${APP_MODE}
APP_PASS: ${APP_MODE}

また.envファイルで定義することもでき、下記のようにdocker-compose.ymlと同階層で定義しておけば、ユーザー固有の定義が簡単にできる。

APP_PORT=local
APP_PASS=password

特にリポジトリにパスワード等を含めたくない時は.envファイルは.gitignoreに入れつつ、.envファイルでパスワードを定義するのが良い。

参考

https://qiita.com/friedaji/items/c1894821a2c49395cfd7

DockerHubのイメージのタグ一覧をコマンドで得る

https://registry.hub.docker.com/v1/repositories/[IMAGE]/tagsからJSONでタグ一覧を得られるのでそれをjqで分解するのがお手軽。以下が例。

$ curl -s https://registry.hub.docker.com/v1/repositories/ubuntu/tags | jq -r '.[] | [.name] | @tsv'
latest
10.04
12.04
12.04.5
12.10
13.04
13.10
14.04
14.04.1
14.04.2
14.04.3
14.04.4
14.04.5

Ubuntuの/tmpが消えるタイミング

Ubuntu Tipsによると

/tmp/
一時的な作業用ディレクトリです。基本的に起動時に空になります。(/etc/init/mounted-tmp.conf) temporary の略です。

とのことでした。RedHat系だとtmpwatchってのがあって、一定時間アクセスのないファイルを削除していた。

docker-composeでthe input device is not a TTYと言われた時の対策

docker-compose  exec app hoge.py < input.txt

で出力を流し込もうとするとTTYが無いよと言われることがある。これはTTYが割り当てられているからであり、下記のようにして無効化するといいみたい。

docker-compose  exec -T app hoge.py < input.txt

-T オプションは

Disable pseudo-tty allocation. By default docker-compose exec allocates a TTY.

TTYを無効にするもの。通常デフォルトの挙動はTTYを割り当ててるらしいが、それが返って邪魔をしているのかなあ。

jqでJSONをCSVやTSVに変換する

jqをインストールする

sudo apt install jq

CSVに変換する

$ echo '[{"a":1},{"a":2},{"a":3}]' | jq -r '.[] | [.a] | @csv'
1
2
3

TSVに変換する

$ echo '[{"a":1},{"a":2},{"a":3}]' | jq -r '.[] | [.a] | @tsv'
1
2
3

Slackで特定のユーザーやボットをミュートするHide Slack Messages

Chrome拡張にこんなものがありました。

https://chrome.google.com/webstore/detail/hide-slack-messages/mjingehmnkofkklkdlipioiinepjghlo

特徴

  1. 任意のユーザーからのメッセージを隠す
  2. ボットからのメッセージを隠す
  3. オプションでメッセージをDMからのみ隠すことを許可する
  4. スレッドでも動作

参考

https://www.quora.com/How-do-you-block-someone-on-Slack