【问题标题】:How to set environmental variables properly Gitlab CI/CD and Docker如何正确设置环境变量 Gitlab CI/CD 和 Docker
【发布时间】:2020-01-10 03:02:15
【问题描述】:

我是 Docker 和带有 Gitlab CI/CD 的 CI/CD 的新手。我的 Django 项目的根目录中有 .env 文件,其中包含我的环境变量,例如 SECRET_KEY=198191891.env 文件包含在 .gitignore 中。我已经在 Gitlab 设置中为 CI/CD 设置了这些变量。但是Gitlab CI/CD设置中设置的环境变量好像不可用

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

这是我的相关文件。

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

这是我的变量设置

这是我失败的管道工作

【问题讨论】:

    标签: django docker docker-compose gitlab gitlab-ci


    【解决方案1】:

    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 图像描述的 Initialization scripts 部分。

    【讨论】:

    • 非常感谢。后来我更改了我的代码,删除了硬编码的密钥并忘记在docker-compose.yml 中访问它。这意味着如果你没有在 web 容器中声明变量,那么你不能在 .gitlab-ci.yml 中设置它?
    • 好吧,GitLab CI 变量更多的是在跑步者的环境中设置值。您可以随心所欲地使用它。在这种情况下,将其传递给 Web 服务的环境规范。
    • 来自我手动执行 ssh 到远程服务器的环境,执行 git pull 并创建我的.env,我如何分离开发.env 和生产.env。我使用 docker-machine 创建了一个 AWS EC2 实例。我创建了一个production.yml 并做了docker-compose -f production.yml up -d。 EC2 机器中的容器接收了我的开发 .env 这不是我想要的。
    【解决方案2】:

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

    GitLab CI/CD variables

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

    settings > CI/CD > Variables

    你必须创建一个ENV_FILE

    演示图片

    接下来在 .gitlab-ci.yml 的构建阶段将 ENV_FILE 复制到本地进程

    .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
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2019-08-07
      • 2020-11-13
      • 2022-12-31
      • 1970-01-01
      • 2021-12-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多