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) | - [How does kaniko work?](#how-does-kaniko-work) | ||||||
| - [Known Issues](#known-issues) | - [Known Issues](#known-issues) | ||||||
| - [Demo](#demo) | - [Demo](#demo) | ||||||
|  | - [Tutorial](#tutorial) | ||||||
| - [Using kaniko](#using-kaniko) | - [Using kaniko](#using-kaniko) | ||||||
|   - [kaniko Build Contexts](#kaniko-build-contexts) |   - [kaniko Build Contexts](#kaniko-build-contexts) | ||||||
|   - [Running kaniko](#running-kaniko) |   - [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 | ## Using kaniko | ||||||
| 
 | 
 | ||||||
| To use kaniko to build and push an image for you, you will need: | 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