Search code examples
kubernetescontainerskubernetes-pod

How to source an sh file in a pod to create env variables?


I have a pod with multiple init containers and one main container. One of the init container create a sh file with some export commands like:

export Foo=Bar

I want to source the file so it creates the env variable like this:

 containers:
    - name: test
      command:
        - "bash"
        - "-c"
      args:
        - "source /path/to/file"

It doesn't create the env variable. But if I run the source command directly in the container it works. What is the best way to do this using the command option in the pod definition?


Solution

  • If you are looking for create the sh in the init container with the variables and then use in the "main container" here is a quick example:

    manifest

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
      labels:
        name: mypod
    spec:
      initContainers:
      - name: my-init-container
        image: alpine:latest
        command: ["sh", "-c", "echo export Foo=bar > /shared/script.sh && chmod +x /shared/script.sh"]
        volumeMounts:
          - name: shared
            mountPath: /shared
      containers:
      - name: mycontainer
        image: mycustomimage
        resources:
          limits:
            memory: "32Mi"
            cpu: "100m"
        volumeMounts:
          - name: shared
            mountPath: /shared
      volumes:
        - name: shared
    

    Dockerfile

    FROM alpine:latest
    
    COPY entrypoint.sh .
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ...
    

    entrypoint.sh

    #!/bin/sh
    . /shared/script.sh
    env
    exec "$@"
    

    logs

    $ kubectl logs pod/mypod
    <...>
    Foo=bar
    <...>
    

    As you can see we can created a script file in the init container with Foo=bar variable and source the file in the "main container", the script is there the volume shared mounted in both containers.

    Most of the situations we use configMaps/secrets/vaults and inject that as variables in the containers as the others answers mentioned. I recommend checking if those can solve your problem first.