我用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"
这是我的特拉维斯
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?谢谢
容器通常不会继承运行它们的环境。 考虑这样的事情:
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"
我有一个类似的问题,并在命令中解决了将环境变量传递给容器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