Add getting started tutorial
This commit is contained in:
		
							parent
							
								
									51734fc3a3
								
							
						
					
					
						commit
						7771d1b448
					
				|  | @ -21,6 +21,7 @@ _If you are interested in contributing to kaniko, see [DEVELOPMENT.md](DEVELOPME | |||
| - [How does kaniko work?](#how-does-kaniko-work) | ||||
| - [Known Issues](#known-issues) | ||||
| - [Demo](#demo) | ||||
| - [Tutorial](#tutorial) | ||||
| - [Using kaniko](#using-kaniko) | ||||
|   - [kaniko Build Contexts](#kaniko-build-contexts) | ||||
|   - [Running kaniko](#running-kaniko) | ||||
|  | @ -77,6 +78,10 @@ kaniko does not support building Windows containers. | |||
| 
 | ||||
|  | ||||
| 
 | ||||
| ## Tutorial | ||||
| 
 | ||||
| For a detailed example of kaniko with local storage, please refer to a [getting started tutorial](./docs/tutorial.md). | ||||
| 
 | ||||
| ## Using kaniko | ||||
| 
 | ||||
| To use kaniko to build and push an image for you, you will need: | ||||
|  |  | |||
|  | @ -0,0 +1,125 @@ | |||
| # Getting Started Tutorial | ||||
| 
 | ||||
| This tutorial is for beginners who want to start using kaniko and aims to establish a quick start test case. | ||||
| 
 | ||||
| ## Table of Content | ||||
| 
 | ||||
| 1. [Prerequisities](#Prerequisities) | ||||
| 2. [Prepare config files for kaniko](#Prepare-config-files-for-kaniko) | ||||
| 3. [Prepare the mounted directory in minikube](#Prepare-the-mounted-directory-in-minikube) | ||||
| 4. [Create a Secret that holds your authorization token](#Create-a-Secret-that-holds-your-authorization-token) | ||||
| 5. [Create resources in kubernetes](#Create-resources-in-kubernetes) | ||||
| 6. [Pull the image and test](#Pull-the-image-and-test) | ||||
| 
 | ||||
| ## Prerequisities | ||||
| 
 | ||||
| - A Kubernetes Cluster. You could use [Minikube](https://kubernetes.io/docs/setup/minikube/) to deploy kubernetes locally, or use kubernetes service from cloud provider like [Azure Kubernetes Service](https://azure.microsoft.com/en-us/services/kubernetes-service/). | ||||
| - A [dockerhub](https://hub.docker.com/) account to push built image public. | ||||
| 
 | ||||
| ## Prepare config files for kaniko | ||||
| 
 | ||||
| After installing minikube, we should prepare several config files to create resources in kubernetes, which are: | ||||
| 
 | ||||
| - [pod.yaml](../examples/pod.yaml) is for starting a kaniko container to build the example image. | ||||
| - [volume.yaml](../examples/volume.yaml) is for creating a persistent volume used as kaniko build context. | ||||
| - [volume-claim.yaml](../examples/volume-claim.yaml) is for creating a persistent volume claim which will mounted in the kaniko container. | ||||
| 
 | ||||
| ## Prepare the local mounted directory | ||||
| 
 | ||||
| SSH into the cluster, and create a local directory which will be mounted in kaniko container as build context. Create a simple dockerfile there. | ||||
| 
 | ||||
| > Note: To ssh into cluster, if you use minikube, you could use `minikube ssh` command. If you use cloud service, please refer to official doc, such as [Azure Kubernetes Service](https://docs.microsoft.com/en-us/azure/aks/ssh#code-try-0). | ||||
| 
 | ||||
| ```shell | ||||
| $ mkdir kaniko && cd kaniko | ||||
| $ echo 'FROM ubuntu' >> dockerfile | ||||
| $ echo 'ENTRYPOINT ["/bin/bash", "-c", "echo hello"]' >> dockerfile | ||||
| $ cat dockerfile | ||||
| FROM ubuntu | ||||
| ENTRYPOINT ["/bin/bash", "-c", "echo hello"] | ||||
| $ pwd | ||||
| /home/<user-name>/kaniko # copy this path in volume.yaml file | ||||
| ``` | ||||
| 
 | ||||
| > Note: It is important to notice that the `hostPath` in the volume.yaml need to be replaced with the local directory you created. | ||||
| 
 | ||||
| ## Create a Secret that holds your authorization token | ||||
| 
 | ||||
| A Kubernetes cluster uses the Secret of docker-registry type to authenticate with a docker registry to push an image. | ||||
| 
 | ||||
| Create this Secret, naming it regcred: | ||||
| 
 | ||||
| ```shell | ||||
| kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> | ||||
| ``` | ||||
| 
 | ||||
| - `<your-registry-server>` is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub) | ||||
| - `<your-name>` is your Docker username. | ||||
| - `<your-pword>` is your Docker password. | ||||
| - `<your-email>` is your Docker email. | ||||
| 
 | ||||
| This secret will be used in pod.yaml config. | ||||
| 
 | ||||
| ## Create resources in kubernetes | ||||
| 
 | ||||
| ```shell | ||||
| # create persistent volume | ||||
| $ kubectl create -f volume.yaml | ||||
| persistentvolume/dockerfile created | ||||
| 
 | ||||
| # create persistent volume claim | ||||
| $ kubectl create -f volume-claim.yaml | ||||
| persistentvolumeclaim/dockerfile-claim created | ||||
| 
 | ||||
| # check whether the volume mounted correctly | ||||
| $ kubectl get pv dockerfile | ||||
| NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS    REASON   AGE | ||||
| dockerfile   10Gi       RWO            Retain           Bound    default/dockerfile-claim   local-storage            1m | ||||
| 
 | ||||
| # create pod | ||||
| $ kubectl create -f pod.yaml | ||||
| pod/kaniko created | ||||
| $ kubectl get pods | ||||
| NAME     READY   STATUS              RESTARTS   AGE | ||||
| kaniko   0/1     ContainerCreating   0          7s | ||||
| 
 | ||||
| # check whether the build complete and show the build logs | ||||
| $ kubectl get pods | ||||
| NAME     READY   STATUS      RESTARTS   AGE | ||||
| kaniko   0/1     Completed   0          34s | ||||
| $ kubectl logs kaniko | ||||
| ➜ kubectl logs kaniko | ||||
| INFO[0000] Resolved base name ubuntu to ubuntu | ||||
| INFO[0000] Resolved base name ubuntu to ubuntu | ||||
| INFO[0000] Downloading base image ubuntu | ||||
| INFO[0000] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory | ||||
| INFO[0000] Downloading base image ubuntu | ||||
| INFO[0001] Built cross stage deps: map[] | ||||
| INFO[0001] Downloading base image ubuntu | ||||
| INFO[0001] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory | ||||
| INFO[0001] Downloading base image ubuntu | ||||
| INFO[0001] Skipping unpacking as no commands require it. | ||||
| INFO[0001] Taking snapshot of full filesystem... | ||||
| INFO[0001] ENTRYPOINT ["/bin/bash", "-c", "echo hello"] | ||||
| ``` | ||||
| 
 | ||||
| > Note: It is important to notice that the `destination` in the pod.yaml need to be replaced with your own. | ||||
| 
 | ||||
| ## Pull the image and test | ||||
| 
 | ||||
| If as expected, the kaniko will build image and push to dockerhub successfully. Pull the image to local and run it to test: | ||||
| 
 | ||||
| ```shell | ||||
| $ sudo docker run -it <user-name>/<repo-name> | ||||
| Unable to find image 'debuggy/helloworld:latest' locally | ||||
| latest: Pulling from debuggy/helloworld | ||||
| 5667fdb72017: Pull complete | ||||
| d83811f270d5: Pull complete | ||||
| ee671aafb583: Pull complete | ||||
| 7fc152dfb3a6: Pull complete | ||||
| Digest: sha256:2707d17754ea99ce0cf15d84a7282ae746a44ff90928c2064755ee3b35c1057b | ||||
| Status: Downloaded newer image for debuggy/helloworld:latest | ||||
| hello | ||||
| ``` | ||||
| 
 | ||||
| Congratulation! You have gone through the hello world successfully, please refer to project for more details. | ||||
|  | @ -0,0 +1,27 @@ | |||
| apiVersion: v1 | ||||
| kind: Pod | ||||
| metadata: | ||||
|   name: kaniko | ||||
| spec: | ||||
|   containers: | ||||
|   - name: kaniko | ||||
|     image: gcr.io/kaniko-project/executor:latest | ||||
|     args: ["--dockerfile=/workspace/dockerfile", | ||||
|             "--context=dir://workspace", | ||||
|             "--destination=<user-name>/<repo>"] # replace with your dockerhub account | ||||
|     volumeMounts: | ||||
|       - name: kaniko-secret | ||||
|         mountPath: /root | ||||
|       - name: dockerfile-storage | ||||
|         mountPath: /workspace | ||||
|   restartPolicy: Never | ||||
|   volumes: | ||||
|     - name: kaniko-secret | ||||
|       secret: | ||||
|         secretName: regcred | ||||
|         items: | ||||
|           - key: .dockerconfigjson | ||||
|             path: .docker/config.json | ||||
|     - name: dockerfile-storage | ||||
|       persistentVolumeClaim: | ||||
|         claimName: dockerfile-claim | ||||
|  | @ -0,0 +1,11 @@ | |||
| kind: PersistentVolumeClaim | ||||
| apiVersion: v1 | ||||
| metadata: | ||||
|   name: dockerfile-claim | ||||
| spec: | ||||
|   accessModes: | ||||
|     - ReadWriteOnce | ||||
|   resources: | ||||
|     requests: | ||||
|       storage: 8Gi | ||||
|   storageClassName: local-storage | ||||
|  | @ -0,0 +1,14 @@ | |||
| apiVersion: v1 | ||||
| kind: PersistentVolume | ||||
| metadata: | ||||
|   name: dockerfile | ||||
|   labels: | ||||
|     type: local | ||||
| spec: | ||||
|   capacity: | ||||
|     storage: 10Gi | ||||
|   accessModes: | ||||
|     - ReadWriteOnce | ||||
|   storageClassName: local-storage | ||||
|   hostPath: | ||||
|     path: <local-directory> # replace with local directory, such as "/home/<user-name>/kaniko" | ||||
		Loading…
	
		Reference in New Issue