Лучшие практики для добавления .env-файла к Docker -Image во время сборки в Gitlab CI - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть node.js Project, который я запускаю как Docker -Container в разных средах (локальная, рабочая, производственная) и поэтому настраиваю его с помощью .env -Files. Как всегда советовали, я не храню .env -файлы в моем удаленном репозитории, который называется Gitlab. Мои производственные и промежуточные системы работают как кластер kubernetes.

Чего я хочу добиться, так это автоматической сборки с помощью CI Gitlab для различных сред (например, stage) в зависимости от ветви коммитов (также называемой stage) Это означает, что когда я отправляю sh в исходное состояние / на сцену, я хочу, чтобы для моей сцены-среды было создано Docker -изображение с соответствующим .env -файлом в нем.

На моей локальной машине это довольно просто, так как у меня есть все различные .env -файлы в root -папке моего приложения, я просто использую это в своем Dockerfile

COPY .env-stage ./.env

и все в порядке.

Поскольку я не храню файлы .env в моем удаленном репо, этот подход не работает, поэтому я использовал переменные Gitlab CI и создал переменную с именем DOTENV_STAGE типа file с содержимым моего local .env-stage file.

Теперь моя проблема: как мне получить этот контент в виде файла .env внутри образа docker, который будет собираться gitlab, так как этот файл еще не является файлом в моем репо, но вместо переменной?

I попытался использовать cp (см. ниже, также в разделе before_script), чтобы просто скопировать файл в .env -файл во время процесса сборки, но это, очевидно, не работает.

My текущий этап сборки выглядит следующим образом:

image: docker:git

services:
  - docker:dind

build stage:
  only:
    - stage
  stage: build
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - cp $DOTENV_STAGE .env
    - docker pull $GITLAB_IMAGE_PATH-$CI_COMMIT_BRANCH || true
    - docker build --cache-from $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH --file=Dockerfile-$CI_COMMIT_BRANCH -t $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH:$CI_COMMIT_SHORT_SHA .
    - docker push $GITLAB_IMAGE_PATH/$CI_COMMIT_BRANCH

Это приводит к

 Step 12/14 : COPY .env ./.env
 COPY failed: stat /var/lib/docker/tmp/docker-builder513570233/.env: no such file or directory

Я также пробовал cp $DOTENV_STAGE .env, а также cp $DOTENV_STAGE $CI_BUILDS_DIR/.env и cp $DOTENV_STAGE $CI_PROJECT_DIR/.env, но ни один из них не работал.

Итак, часть, которую я на самом деле не знаю: куда мне поместить файл, чтобы сделать его доступным для docker во время сборки?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

После еще одного исследования я наткнулся на эту запись на форуме поддержки на gitlab.com , которая точно описывает мою ситуацию, и она была решена с помощью того же подхода, который я пытался использовать, а именно:

...
script:
- cp $DOTENV_STAGE $CI_PROJECT_DIR/.env
...

в моем .gitlab-ci.yml

Часть, которую я фактически пропустил, корректировала мой .dockerignore -файл соответственно (удаляя из него .env) и затем удаляя строку

COPY .env ./.env

из моего Dockerfile

Альтернативный подход Я думал о том, что после ответа joyarjo можно использовать ConfigMap для Kubernetes . Но я еще не пробовал

0 голосов
/ 22 апреля 2020

Вам следует избегать копирования файла .env в контейнер вообще. Скорее кормите его снаружи во время выполнения. Для этого есть специальная опора: env_file .

web:
  env_file:
    - .env

Содержимое самого файла .env можно хранить в замаскированной переменной в бэкэнде CI GitLabs. Затем выгрузите его в файл .env в модуле и передайте в Docker составьте конвейер.

...