#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 в соответствии со средой, в которой вы сейчас создаете.
Дополнительные документы:
- как использовать его с помощью Docker Compose — https://docs.docker.com/compose/compose-file/#args
- дополнительная документация — https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact