機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

k8sコンテナでコマンド実行するマニフェストファイル記述例

f:id:orinbou:20200508000144p:plain

k8sコンテナでコマンドを実行するマニフェストファイルの記述例を紹介します。

TL;DR

下記の流れでk8sコンテナでコマンドを実行するサンプルをいくつか試してみました。

  • サンプル1:単純な引数ありコマンドを実行する(commandのみ)記述方法
  • サンプル2:シェルで複数の引数ありコマンドを実行する(commandのみ)記述方法
  • サンプル3:シェルで複数の引数ありコマンドを実行する(command + args)記述方法①
  • サンプル4:シェルで複数の引数ありコマンドを実行する(command + args)記述方法②
  • サンプル5:シェルで複数の引数ありコマンドを実行する(command + 環境変数)記述方法
  • まとめ

サンプル1

単純な引数ありコマンドを実行する(commandのみ)記述方法

■ sample01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample01
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['echo' , 'The sample01 app is running!']

サンプルpodをデプロイ

$ kubectl apply -f sample01.yaml
pod/sample01 created

サンプルpodの実行確認

$ kubectl logs sample01
The sample01 app is running!

ちゃんと実行されてますね。 ただし、コンテナのメインプロセスが即終了するためコンテナが再起動を繰り返してしまいます。

$ kubectl get pods sample01 -w
NAME       READY     STATUS      RESTARTS   AGE
sample01   0/1       Completed   1          7s
sample01   0/1       CrashLoopBackOff   1         7s
sample01   0/1       Completed   2         21s
sample01   0/1       CrashLoopBackOff   2         34s
sample01   0/1       Completed   3         48s
sample01   0/1       CrashLoopBackOff   3         1m

サンプル2

シェルで複数の引数ありコマンドを実行する(commandのみ)記述方法

■ sample02.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample02
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'echo The sample02 app is running! && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample02.yaml
pod/sample02 created

サンプルpodの実行確認

$ kubectl logs sample02
The sample02 app is running!

ちゃんと実行されてますね。

サンプル3

シェルで複数の引数ありコマンドを実行する(command + args)記述方法①

■ sample03.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample03
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh']
    args: ['-c', 'echo The sample03 app is running! && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample03.yaml
pod/sample03 created

サンプルpodの実行確認

$ kubectl logs sample03
The sample03 app is running!

ちゃんと実行されてますね。

サンプル4

シェルで複数の引数ありコマンドを実行する(command + args)記述方法②

■ sample04.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample04
spec:
  containers:
  - name: busybox
    image: busybox
    command:
    - 'sh'
    args:
    - '-c'
    - 'echo The sample04 app is running! && sleep 3600'

サンプルpodをデプロイ

$ kubectl apply -f sample04.yaml
pod/sample04 created

サンプルpodの実行確認

$ kubectl logs sample04
The sample04 app is running!

ちゃんと実行されてますね。

サンプル5

シェルで複数の引数ありコマンドを実行する(command + 環境変数)記述方法

■ sample05.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample05
spec:
  containers:
  - name: busybox
    image: busybox
    env:
    - name: MESSAGE
      value: 'The sample05 app is running!'
    command: ['sh', '-c', 'echo $(MESSAGE) && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample05.yaml
pod/sample05 created

サンプルpodの実行確認

$ kubectl logs sample05
The sample05 app is running!

ちゃんと実行されてますね。

まとめ

同じような実行結果を出力する場合でも、いろいろな書き方があります。 全てを覚える必要はありませんが、書き方は一つじゃないということと、 変にハマらないために、まずは無難な書き方を覚えて徐々に慣れるのが良いと思います。

参考URL

この記事を書くにあたり下記の情報を参考にさせていただきました。