web-dev-qa-db-ja.com

引数をコンテナに渡す際のKubernetesポッド/デプロイ?

Docker/k8sの世界は初めてです...引数を使用してコンテナをデプロイして動作を変更できるかどうかを尋ねられました(通常、アプリが「マスター」または「スレーブ」バージョンで動作している場合)。おそらく最適なソリューションではありませんが、機能します。

これは検証するための簡単なテストです。次のスクリプトを使用してカスタムイメージを作成しました:role.sh:

#!/bin/sh
ROLE=$1
echo "You are running "$ROLE" version of your app"

Dockerfile:

FROM centos:7.4.1708

COPY ./role.sh /usr/local/bin
RUN chmod a+x /usr/local/bin/role.sh
ENV ROLE=""
ARG ROLE

ENTRYPOINT ["role.sh"]
CMD ["${ROLE}"]

次のコマンドを使用して、このコンテナーをdockerで起動した場合:

docker run -dit --name test docker.local:5000/test master

最終的に次のログが表示されます。これはまさに私が探しているものです。

You are running master version of your app

ここで、yamlファイルを使用して、k8sで同じ動作をしたいと思います。私はいくつかの方法を試しましたが、どれもうまくいきませんでした。

YAMLファイル:

apiVersion: v1
kind: Pod
metadata:
  name: master-pod
  labels:
     app: test-master
spec:
  containers:
    - name: test-master-container
      image: docker.local:5000/test
      command: ["role.sh"]
      args: ["master"]

私はこれを行うための非常に多くの異なる方法を見ました、そして私はまだARGとENVの違いを理解していないと言わなければなりません。

私も試してみました

 - name: test-master-container
   image: docker.local:5000/test
   env:
     - name: ROLE
       value: master

そして

 - name: test-master-container
   image: docker.local:5000/test    
   args:
     - master

しかし、これらはどれも機能しませんでした。私のポッドは常にCrashLoopBackOff状態です。ご協力いただきありがとうございます。

3
IsKor

あなたの特定の状況に答えるために、あなたのARGもENVも、あなたがそれらを宣言した方法を考えると効果がないようです。

ワークフローは次のようになります。

  1. dockerfileを作成します(あなたがしたように、わかりました)
  2. buildコンテナ(使用したビルドコマンドを指定していませんが、ARGの宣言があるため、そこに値を渡す必要があると思います)
  3. コンテナを実行します(_docker run_またはkubernetesポッド/デプロイなど)

_ENV ROLE=""_は、ビルド中に、Dockerfile全体で使用できる空の変数$ ROLEが必要であり、実行中のコンテナーの環境で同じ名前で(おそらく空の文字列として)使用できることを意味します。

_ARG ROLE_は、ビルド中にDockerfile全体で使用できる_docker build_コマンドにROLEを渡す必要があることを意味します。おそらく、以前に宣言されたENVを上書きしますが、ビルドプロセス以外には影響しません。

実行中のスクリプトに関する限り、重要な唯一の役割は_ROLE=$1_です。最初の引数の値をとる変数$ ROLE。これは、スクリプトの実行時に、スクリプトの最初の引数がない場合でもRULEが上書きされるため(結果として値が空になるため)、kubernetesymlでenvRULEを指定することは無意味であることを意味します。

この仕様は正しいように見えます。_args: ["master"]_をargs: ["$(ROLE)"]のようなものに置き換えることができることを忘れないでください(例:kubectlを実行するマシンにROLE envvarが設定されることが期待されます。

_apiVersion: v1
kind: Pod
metadata:
  name: master-pod
  labels:
     app: test-master
spec:
  containers:
    - name: test-master-container
      image: docker.local:5000/test
      command: ["role.sh"]
      args: ["master"]
_
0
Andrei Dascalu