如何正确设置环境变量Gitlab CI/CD和Docker

14

我对 Docker 和使用 Gitlab CI/CD 进行持续集成和部署很陌生。我在 Django 项目的根目录下有一个 .env 文件,其中包含我的环境变量,例如 SECRET_KEY=198191891。该 .env 文件已包含在 .gitignore 中。我在 Gitlab 的 CI/CD 设置中设置了这些变量。但是,似乎无法访问在 Gitlab CI/CD 设置中设置的环境变量。

此外,Gitlab CI/CD 自动化流程如何创建用户和数据库以连接并运行测试?在我的本地机器上为 DB 和用户创建 DB 时,我登录到容器 docker exec -it <postgres_container_name> /bin/sh 并创建了 Postgres 用户和 DB。

以下是相关文件。

docker-compose.yml

version: "3"
services:
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/
  web:
    build: .
    command: /usr/local/bin/gunicorn writer.wsgi:application -w 2 -b :8000
    environment:
      DEBUG: ${DEBUG}
      DB_HOST: ${DB_HOST}
      DB_NAME: ${DB_NAME}
      DB_USER: ${DB_USER}
      DB_PORT: ${DB_PORT}
      DB_PASSWORD: ${DB_PASSWORD}
      SENDGRID_API_KEY: ${SENDGRID_API_KEY}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_STORAGE_BUCKET_NAME: ${AWS_STORAGE_BUCKET_NAME}
    depends_on:
      - postgres
      - redis
    expose:
      - "8000"
    volumes:
      - .:/writer-api
  redis:
    image: "redis:alpine"
  celery:
    build: .
    command: celery -A writer worker -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  celery-beat:
    build: .
    command: celery -A writer beat -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    depends_on:
      - web
volumes:
  pgdata:

.gitlab-ci.yml

image: tmaier/docker-compose:latest

services:
  - docker:dind

before_script:
  - docker info
  - docker-compose --version

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - echo "Building the app"
    - docker-compose build

test:
  stage: test
  variables:
  script:
    - echo "Testing"
    - docker-compose run web coverage run manage.py test

deploy-staging:
  stage: deploy
  only:
    - develop
  script:
    - echo "Deploying staging"
    - docker-compose up -d

deploy-production:
  stage: deploy
  only:
    - master
  script:
    - echo "Deploying production"
    - docker-compose up -d

这是我变量的设置: 图片描述

这是我的失败管道作业: 图片描述

3个回答

6

根据我的经验,将环境变量传递给Docker容器的最佳方式是创建一个环境文件,它适用于开发环境和生产环境:

GitLab CI/CD variables

您必须在GitLab CI/CD上创建一个环境文件,按照以下步骤进行操作,在您的项目GitLab上,您必须转到:

设置 > CI/CD > 变量

在那里,您必须创建一个ENV_FILE

演示图片

enter image description here

下一步,在您的构建阶段中,将ENV_FILE复制到本地进程中。请在.gitlab-ci.yml文件中完成此操作。 .gitlab-ci.yml
build:
  stage: build
  script:
    - cp $ENV_FILE .env
    - echo "Building the app"
    - docker-compose build

您的Dockerfile应该保持正常,这样它就不必更改。 Dockerfile
FROM python:3.8.6-slim

# Rest of setup goes here...

COPY .env .env

6
SECRET_KEY 变量将根据配置对所有 CI 作业可用。但是,在您的 Docker Compose 文件中没有任何与之相关的引用,以便将其传递给一个或多个服务。如果要使 Web 服务使用它,您需要像其他变量一样映射它。
  web:
    build: .
    command: /usr/local/bin/gunicorn writer.wsgi:application -w 2 -b :8000
    environment:
      SECRET_KEY: ${SECRET_KEY}
      DEBUG: ${DEBUG}
      

关于创建数据库,您需要将当前在postgres容器中交互运行的任何内容打包到SQL文件或shell脚本中,然后将其绑定到容器初始化脚本目录下的/docker-entrypoint-initdb.d。更多详情请参见postgres镜像描述中的初始化脚本部分。


非常感谢。我稍后更改了我的代码,删除了硬编码的密钥,并忘记在 docker-compose.yml 中访问它。这意味着如果您没有在 web 容器中声明变量,则无法在 .gitlab-ci.yml 中设置它? - theTypan
嗯,更确切地说,GitLab CI变量正在设置运行环境中的值。然后您可以随意使用这些值。在这种情况下,将其传递给Web服务的环境规范。 - King Chung Huang
来自一个手动进行ssh到远程服务器、执行git pull并创建我的.env的环境,我该如何区分开发.env和生产.env。我使用了docker-machine创建了一个AWS EC2实例。我创建了一个production.yml文件,并执行了docker-compose -f production.yml up -d。EC2机器中的容器捕获了我的开发.env,这不是我想要的。 - theTypan

0
为了使组合变量替换工作正常,当用户未添加到docker组时,您必须在sudo命令中添加-E标志。
script:
        - sudo -E docker-compose build

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接