# k8s pod 환경에서 이미지 빌드를 위해 kaniko 를 사용한다.
# github pull, docker registry push 를 위해 다음 2가지를 준비한다.
# github > personal_access_token > repo 접근 권한체크해서 생성
kubectl create secret generic ysoftman-generic-secret \
--from-literal=git-personal-access-token="abc123" \
--namespace=ysoftman-test
# 이미지 푸시를 위새 docker secret 생성
kubectl create secret docker-registry ysoftman-secret \
--docker-server=ysoftman \
--docker-username=ysoftman \
--docker-password=ysoftman123 \
--namespace=ysoftman-test
# 이제 argo workflow 로 kaniko(executor) 로 실행하는데,
# dockerfile ARGS 에 전달하기 위해 --build-arg 옵션을 아래와 같이 사용했다.
# argo workflow fields <https://argo-workflows.readthedocs.io/en/stable/fields/>
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: ysoftman-test
namespace: ysoftman-test
spec:
entrypoint: build-image-and-push
serviceAccountName: workflow-template
templates:
- name: build-image-and-push
inputs:
parameters:
- name: fruit
value: "lemon"
script:
image: "rockylinux:latest"
command: [bash]
source: |
curl -X GET "https://httpbin.org/get" -H "accept: application/json"
echo "-----"
echo $ysoftman1
echo $ysoftman2
env:
- name: ysoftman1
value: lemon
- name: ysoftman2
valueFrom:
secretKeyRef:
name: my-secret # name of an existing k8s secret
key: mypassword # 'key' subcomponent of the secret
container:
name: kaniko
image: "gcr.io/kaniko-project/executor:debug"
env:
- name: github_personal_access_token
valueFrom:
secretKeyRef:
name: ysoftman-generic-secret
key: git-personal-access-token
command: [executor]
args:
- "--context=git://$(github_personal_access_token)@github.com/ysoftman/foobar.git#refs/heads/branch1"
- "--context-sub-path=./aaa/bbb"
- "--dockerfile=Dockerfile"
- "--destination=ysoftman/foobar:test"
- "--build-arg var1={{inputs.parameters.fruit}}"
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker/
volumes:
- name: kaniko-secret
secret:
secretname: ysoftman-secret
items:
- key: .dockerconfigjson
# 그런데 pod 로그에 다음과 같이 에러가 발생한다.
Error: unknown flag: --build-arg var1
# --build-arg 사용시 IFS(Internal Field Separator) 공백구분을 지원하지 않아 export IFS='' 를 설정하라고 한다.
# 위 와 같은 yaml 에서는 IFS 설정이 안되니 다음과 같이 구분하면 된다.
args:
- "--build-arg"
- "var1={{inputs.parameters.fruit}}"
# 그리고 container > args 에서 env 참조시 $(VAR_NAME) 를 사용해야 한다.
args:
- "foobar=$(github_personal_access_token)"