Как показать результаты шага сборки с помощью Docker + Google Cloud Build

Я пытаюсь создать приложение next.js в Google Cloud Build в монорепозитории с использованием рабочих пространств Yarn. Я обнаружил, что одним из самых медленных моментов в процессе сборки является установка узловых модулей, поскольку мы должны делать это в нескольких разных папках. В идеале я бы хотел использовать Docker для обработки кеширования node_modules, если ничего не изменилось. Мой Dockerfile выглядит следующим образом:

FROM node:10.13
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install -g yarn
RUN yarn
COPY . .

Мой cloudbuild.yaml находится ниже:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/dashboard-modules', './packages/dashboard' ]
- name: node:10.15.1
  entrypoint: yarn
  # `yarn build-dev` relies on the installation of `next` that happens in the previous step
  args: ['--cwd', 'packages/dashboard', 'build-dev']
...

Я ожидаю, что при первой сборке COPY package*.json будет просматривать содержимое package.json и, если ничего не изменилось, сохранит тот же результат для node_modules. Одним из очень важных шагов здесь является установка next, которая используется позже в процессе сборки для сборки самого приложения из package.json:

"scripts": {
  "build": "next build",
  ...
}

Однако, когда я перехожу ко второму шагу в cloudbuild.yaml, мои ошибки сборки с env: 'next': No such file or directory.

Похоже, мне нужно как-то «всплыть» (из-за отсутствия лучшего термина), что бы ни происходило на первом шаге cloudbuild.yaml, и сделать команду next доступной для второго шага. Но у меня вопрос: как я могу это сделать?

Следует отметить, что я новичок в Docker и пытаюсь понять, как он работает.


person imjared    schedule 22.11.2019    source источник


Ответы (1)


Философия Cloud Build заключается в том, что мы последовательно объединяем шаги для создания результата (обычно либо одного нового образа докера, либо артефактов, которые нужно записать в GCS). Каждый шаг в рецепте Cloud Build запускается в собственном экземпляре контейнера докеров. Совместное использование между каждым шагом - это данные, содержащиеся в /workspace, который является общим томом. Считается, что каждый шаг будет добавлять некоторую ценность сборке, манипулируя данными в / workspace.

Ваша первая команда в рецепте Cloud Build вызывает создание нового образа Docker, который сохраняется в локальном кеше образов Docker. Однако команды, описанные в вашем файле Docker, выполняются в этом образе Docker для создания образа. Они не будут вносить никаких изменений в вашу среду / workspace, и, следовательно, на втором этапе сборки облака не будет ничего «нового».

person Kolban    schedule 22.11.2019
comment
Спасибо что нашли время ответить. Для меня все это подтверждается. Думаю, у меня все еще есть вопрос, как это сделать. Кажется, что другие шаги позволяют вывести на поверхность результат этого первого образа Docker. Возможно ли это, или я полностью запутался в том, как использовать Docker в этом контексте? - person imjared; 22.11.2019
comment
Вы можете создать образ докера (скажем ... например ... вне истории Cloud Build) ... и использовать контейнер, созданный из этого образа докера, в качестве шага в Cloud Build. См. cloud.google.com/cloud-build/docs/create. -custom-build-steps - person Kolban; 22.11.2019