【问题标题】:Set secret variable when using Docker in TravisCI在 TravisCI 中使用 Docker 时设置秘密变量
【发布时间】:2020-04-01 18:14:06
【问题描述】:

我使用 NodeJS 构建了一个后端,并希望使用 TravisCI 和 Docker 来运行测试。

在我的代码中,我有一个秘密环境:process.env.SOME_API_KEY

这是我的 Dockerfile.dev

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

我的码头工人撰写:

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"

这是我的 TravisCI

sudo: required
services:
  - docker

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

script:
  - docker-compose exec api npm run test

我还在我的 travis 设置变量中设置了 SOME_API_KEY='xxx'。但是,容器似乎没有收到 SOME_API_KEY。

如何将 SOME_API_KEY 从 travisCI 传递给 docker?谢谢

【问题讨论】:

  • 请务必将 Travis(设置页面)中的环境变量添加到引号内,例如:FOO="foo"

标签: docker travis-ci


【解决方案1】:

容器通常不会继承运行它们的环境。考虑这样的事情:

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

这永远不会打印出$SOMEVARIABLE 的值,因为没有神奇的过程可以将环境变量从本地 shell 导入容器。如果你想在你的 docker 容器中公开一个 travis 环境变量,你需要通过在你的docker-compose.yml 中创建一个适当的environment 块来明确地做到这一点。比如我使用下面的docker-compose.yml

version: "3"

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

然后我可以运行以下命令:

export SOMEVARIABLE=somevalue
docker-compose up

并查看以下输出:

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

所以你需要这样写:

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"

【讨论】:

  • 而 SOME_API_KEY 的值来自于 Travis 变量设置?
  • 假设你已经配置了,是的。您可以在运行 docker-compose 之前在脚本中粘贴一个命令,以验证变量是否在环境中(例如,awk 'BEGIN{for(v in ENVIRON) print v}',它打印环境变量 names 而不打印值)。
【解决方案2】:

我有一个类似的问题并解决了它在docker-compose exec 命令中将环境变量传递给容器。如果变量在 Travis 环境中,可以这样做:

sudo: required
services:
  - docker

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

script:
  - docker-compose exec -e SOME_API_KEY=$SOME_API_KEY api npm run test

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2019-11-08
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多