Search code examples
kubernetescronyamlwgetbusybox

cronjob yml file with wget command


Hi I'm new with Kubernetes. I'm trying to run wget command in cronjob.yml file to get data from url each day. For now I'm testing it and pass schedule as 1min. I also add some echo command just to get some response from that job. Below is my yml file. I'm changing directory to folder where I want to save data and passing url with site from which I'm taking it. I tried url in terminal with wget url and it works and download json file hidden in url.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: reference
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: reference
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
            - cd /mnt/c/Users/path_to_folder
            - wget {url}
          restartPolicy: OnFailure

When I create job and watch the pod logs nothing happen with url, I don't get any response. Commands I run are:

  • kubectl create -f cronjob.yml
  • kubectl get pods

kubectl get pods info

  • kubectl logs <pod_name>

enter image description here

In return I just get only command with date (img above)

When I leave just command with wget, nothing happen. In pods I can see in STATUS CrashLoopBackOff. So the command has problem to run.

command:
                - cd /mnt/c/Users/path_to_folder
                - wget {url}

kubectl get pods info

How does wget command in cronjob.yml should look like?


Solution

  • The command in kubernetes is docker equivalent to entrypoint in docker. For any container, there should be only one process as entry point. Either the default entry point in the image or supplied via command.

    Here you are using /bin/sh as a single process and everything else as it's argument. The way you were executing /bin/sh -c , it means providing date; echo Hello from the Kubernetes cluster as input command. NOT the cd and wget commands. Change your manifest to the following to feed everything as one block to the /bin/sh. Note that, all the commands is fit as 1 argument.

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: reference
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: reference
                image: busybox
                imagePullPolicy: IfNotPresent
                command:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster; cd /mnt/c/Users/path_to_folder;wget {url}
              restartPolicy: OnFailure
    

    To illustrate the problem, check the following examples. Note that only 1st argument is executed.

    /bin/sh -c date
    Tue 24 Aug 2021 12:28:30 PM CDT
    /bin/sh -c echo hi
    
    /bin/sh -c 'echo hi'
    hi
    /bin/sh -c 'echo hi && date'
    hi
    Tue 24 Aug 2021 12:28:45 PM CDT
    /bin/sh -c 'echo hi' date #<-----your case is similar to this, no date printed.
    hi
    
           -c               Read commands from the command_string operand instead of from the standard input.  Special parameter 0
                            will be set from the command_name operand and the positional parameters ($1, $2, etc.)  set from the re‐
                            maining argument operands.