Search code examples
dockertravis-ci

Set secret variable when using Docker in TravisCI


I build a backend with NodeJS and would like to use TravisCI and Docker to run tests.

In my code, I have a secret env: process.env.SOME_API_KEY

This is my Dockerfile.dev

FROM node:alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]

My docker compose:

version: "3"
services:
  api:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
    - /app/node_modules
    - .:/app
    ports:
    - "3000:3000"
    depends_on:
    - mongo
  mongo:
    image: mongo:4.0.6
    ports:
    - "27017:27017"

And this is my TravisCI

sudo: required
services:
  - docker

before_script:
  - docker-compose up -d --build

script:
  - docker-compose exec api npm run test

I also set SOME_API_KEY='xxx' in my travis setting variables. However, it seems that the container doesn't receive the SOME_API_KEY.

How can I pass the SOME_API_KEY from travisCI to docker? Thanks


Solution

  • Containers in general do not inherit the environment from which they are run. Consider something like this:

    export SOMEVARIABLE=somevalue
    docker run --rm alpine sh -c 'echo $SOMEVARIABLE'
    

    That will never print out the value of $SOMEVARIABLE because there is no magic process to import environment variables from your local shell into the container. If you want a travis environment variable exposed inside your docker containers, you will need to do that explicitly by creating an appropriate environment block in your docker-compose.yml. For example, I use the following docker-compose.yml:

    version: "3"
    
    services:
      example:
        image: alpine
        command: sh -c 'echo $SOMEVARIABLE'
        environment:
          SOMEVARIABLE: "${SOMEVARIABLE}"
    

    I can then run the following:

    export SOMEVARIABLE=somevalue
    docker-compose up
    

    And see the following output:

    Recreating docker_example_1 ... done
    Attaching to docker_example_1
    example_1  | somevalue
    docker_example_1 exited with code 0
    

    So you will need to write something like:

    version: "3"
    
    services:
      api:
        build:
          context: .
          dockerfile: Dockerfile.dev
        volumes:
          - /app/node_modules
          - .:/app
        ports:
          - "3000:3000"
        depends_on:
          - mongo
        environment:
          SOME_API_KEY: "${SOME_API_KEY}"
    
      mongo:
        image: mongo:4.0.6
        ports:
          - "27017:27017"