Как установить другую переменную ENV при создании и развертывании образа Docker для облачного запуска?

#docker #dockerfile #gcloud #google-cloud-run #google-cloud-build

# #docker #dockerfile #gcloud #google-cloud-run #google-cloud-build

Вопрос:

У меня есть серверная служба, которую мне нужно будет развернуть Google Cloud Run .

Из руководства Google по облачному запуску мы получаем, что:

Сначала вам нужно создать свой образ и отправить его в Cloud Build.

 gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld
 

Только после этого вы развертываете его для облачного запуска:

 gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed
 

Я получаю последовательность выше. Но я буду развертывать эту службу в 2 разных средах: TEST и PROD .

Итак, мне нужна SERVER_ENV переменная, которая должна быть "PROD" в моей производственной среде, и, конечно же, она должна быть "TEST" в моей тестовой среде. Это делается для того, чтобы мой сервер (экспресс-сервер, который будет запускаться из контейнера) знал, к какой базе данных подключаться.

Но проблема в том, что у меня есть только один Dockerfile :

 FROM node:12-slim

ENV SERVER_ENV=PROD

WORKDIR /

COPY ./package.json ./package.json
COPY ./distApp ./distApp
COPY ./distService ./distService
COPY ./public ./public

RUN npm install

ENTRYPOINT npm start
 

Итак, как я могу установить разные ENV переменные, следуя приведенной выше последовательности сборки и развертывания? Есть ли в gcloud builds submit комментарии опция, которую я могу что-то переопределить? Или использовать другой Dockerfile ? У кого-нибудь есть другие идеи?

ИДЕЯ:

Может быть, использовать файл конфигурации облачной сборки?

cloudbuild.yaml

Комментарии:

1. я думаю, что то, чего вы пытаетесь достичь, возможно с помощью аргументов сборки: vsupalov.com/docker-env-vars . если это сработает, я отправлю обычный ответ

Ответ №1:

Вы не можете достичь этого без cloudbuild.yaml файла. Команда gcloud builds submit --tag ... не принимает дополнительный параметр docker.

Вот пример конфигурации

 FROM node:12-slim

ARG SERVER_CONF=PROD
ENV SERVER_ENV=$SERVER_CONF

WORKDIR /

COPY ./package.json ./package.json
COPY ./distApp ./distApp
COPY ./distService ./distService
COPY ./public ./public

RUN npm install

ENTRYPOINT npm start
 

Я создал аргумент сборки SERVER_CONF . Вы ENV будете принимать это значение во время сборки. Значение по умолчанию равно PROD

Теперь ваш cloudbuild.yaml файл

 step:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '--tag=gcr.io/PROJECT-ID/helloworld', '--build-arg="SERVER_CONF=$_SERVER_CONF"', '.']
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/PROJECT-ID/helloworld']
substitutions:
  _SERVER_CONFPROD: PROD
 

Используйте переменные подстановки для изменения среды. Не то чтобы здесь вы также могли установить значение по умолчанию, которое переопределяет значение вашего Dockerfile. Позаботьтесь об этом!

Вы также можете установить тег в качестве переменной подстановки, если хотите

В конце концов, как вызвать сборку облака

 # With default server conf (no substitution variables, the the file default)
gcloud builds submit

# With defined server conf
gcloud builds submit --substitutions=_SERVER_CONF=TEST
 

Комментарии:

1. Спасибо. Неужели это невозможно сделать, используя только gcloud CLI? Я думаю, мне придется немного глубже погрузиться в документацию по облачной сборке. Как вы думаете, возможно ли создать образ локально и развернуть его прямо в облаке? Например, обойти этап построения облака.

2. Да, вы можете создавать локально, но вам нужно нажать изображение в конце docker build --tag=gcr.io/PROJECT-ID/helloworld --build-arg=SERVER_CONF=TEST . amp;amp; docker push gcr.io/PROJECT-ID/helloworld

Ответ №2:

Я думаю, что то, чего вы пытаетесь достичь, возможно с помощью ARG инструкции в Dockerfile.

Я бы установил для него значение be test , а затем использовал параметр arg в соответствии со средой, в которой вы сейчас создаете.

Дополнительные документы: