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状態です。ご協力いただきありがとうございます。
あなたの特定の状況に答えるために、あなたのARGもENVも、あなたがそれらを宣言した方法を考えると効果がないようです。
ワークフローは次のようになります。
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"]
_