Создание образа докера приложения nuxt с использованием действий github завершается ошибкой (превышен размер кучи памяти)

#docker #github #dockerfile #nuxt.js #github-actions

Вопрос:

Я пытаюсь настроить рабочий процесс действий Github для автоматического создания и отправки изображения docker моего приложения nuxt,

Когда рабочий процесс завершается, я извлекаю изображение и запускаю его, веб-приложение не загружается, а потребление памяти начинает увеличиваться и увеличиваться, пока контейнер docker не остановится со следующей ошибкой.

<— Последние несколько GCs —>

[28:0x7f75bc1ae310] 730417 мс: Метка-развертка (уменьшить) 2040.7 (2083.0) -> 2039.5 (2083.2) МБ, 4274,1 / 0,5 мс (средний mu = 0,200, текущий mu = 0,163) удаление ошибок при выделении может не увенчаться успехом [28:0x7f75bc1ae310] 734992 мс: Разметка (уменьшение) 2040.6 (2083.2) ->> 2039.7 (2083.2) МБ, 4549,0 / 0,5 мс (средний mu = 0,112, текущий mu = 0,006) удаление ошибок при выделении может не увенчаться успехом

<— Трассировка стека JS —>

ФАТАЛЬНАЯ ОШИБКА: Неэффективная пометка-не удалось выполнить сжатие вблизи предела кучи — Информация о кучи JavaScript отсутствует в памяти. https://yarnpkg.com/en/docs/cli/run для получения документации об этой команде. ошибка команды не удалось выполнить с сигналом «SIGABRT».

Я сделал последовательность процесса моего контейнера, и эта часть повторялась бесконечно (сетевой вызов конечной точки API, которую я вызываю в своем приложении «GET /теги/активен»).

 write(42261, "GET /tags/active HTTP/1.1rnAccep"..., 797) = 797
getsockopt(42262, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
write(42262, "GET /tags/active HTTP/1.1rnAccep"..., 778) = 778
epoll_ctl(13, EPOLL_CTL_ADD, 42263, {events=EPOLLIN, data={u32=42263, u64=42263}}) = 0
epoll_ctl(13, EPOLL_CTL_ADD, 42264, {events=EPOLLIN, data={u32=42264, u64=42264}}) = 0
epoll_ctl(13, EPOLL_CTL_ADD, 42261, {events=EPOLLIN, data={u32=42261, u64=42261}}) = -1 EEXIST (File exists)
epoll_ctl(13, EPOLL_CTL_MOD, 42261, {events=EPOLLIN, data={u32=42261, u64=42261}}) = 0
epoll_ctl(13, EPOLL_CTL_ADD, 42262, {events=EPOLLIN, data={u32=42262, u64=42262}}) = -1 EEXIST (File exists)
epoll_ctl(13, EPOLL_CTL_MOD, 42262, {events=EPOLLIN, data={u32=42262, u64=42262}}) = 0
epoll_pwait(13, [{events=EPOLLIN, data={u32=42263, u64=42263}}, {events=EPOLLIN, data={u32=42264, u64=42264}}], 1024, 0, NULL, 8) = 2
read(42263, "GET /tags/active HTTP/1.1rnAccep"..., 65536) = 797
futex(0x7f75b35e69a4, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x557c4d5da464, FUTEX_WAKE_PRIVATE, 1) = 1
read(42264, "GET /tags/active HTTP/1.1rnAccep"..., 65536) = 778
futex(0x7f75b25e09a4, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x557c4d5da464, FUTEX_WAKE_PRIVATE, 1) = 1
epoll_pwait(13, [{events=EPOLLIN, data={u32=16, u64=16}}], 1024, 0, NULL, 8) = 1
read(16, "1", 1024)      = 8
futex(0x7f75b2de39a4, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x557c4d5da464, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x7f75b1ddd9a4, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x557c4d5da464, FUTEX_WAKE_PRIVATE, 1) = 1
epoll_pwait(13, [{events=EPOLLIN, data={u32=16, u64=16}}], 1024, 0, NULL, 8) = 1
read(16, "1", 1024)      = 8
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 42265
connect(42265, {sa_family=AF_INET, sin_port=htons(3000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 42266
connect(42266, {sa_family=AF_INET, sin_port=htons(3000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
epoll_ctl(13, EPOLL_CTL_ADD, 42265, {events=EPOLLOUT, data={u32=42265, u64=42265}}) = 0
epoll_ctl(13, EPOLL_CTL_ADD, 42266, {events=EPOLLOUT, data={u32=42266, u64=42266}}) = 0
epoll_pwait(13, [{events=EPOLLIN, data={u32=18, u64=18}}, {events=EPOLLOUT, data={u32=42265, u64=42265}}, {events=EPOLLOUT, data={u32=42266, u64=42266}}], 1024, 0, NULL, 8) = 3
accept4(18, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK) = 42267
getpeername(42267, {sa_family=AF_INET, sin_port=htons(35257), sin_addr=inet_addr("127.0.0.1")}, [128 => 16]) = 0
accept4(18, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK) = 42268
getpeername(42268, {sa_family=AF_INET, sin_port=htons(35259), sin_addr=inet_addr("127.0.0.1")}, [128 => 16]) = 0
accept4(18, NULL, NULL, SOCK_CLOEXEC|SOCK_NONBLOCK) = -1 EAGAIN (Resource temporarily unavailable)
getsockopt(42265, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
write(42265, "GET /tags/active HTTP/1.1rnAccep"..., 797) = 797
getsockopt(42266, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
write(42266, "GET /tags/active HTTP/1.1rnAccep"..., 778) = 778
 

This is my Dockerfile

 FROM node:alpine as builder


WORKDIR /app
 
RUN apk update amp;amp; apk upgrade amp;amp; apk add git
 
COPY package.json yarn.lock ./
 
RUN yarn install 
  --prefer-offline 
  --frozen-lockfile 
  --non-interactive 
  --production=false
 
COPY . .
 
RUN --mount=type=secret,id=MOUHIM_API_URL 
    --mount=type=secret,id=GOOGLE_CLIENT_ID 
      --mount=type=secret,id=GOOGLE_REDIRECT_URI 
        --mount=type=secret,id=FACEBOOK_CLIENT_ID 
          --mount=type=secret,id=FACEBOOK_REDIRECT_URI 
           export MOUHIM_API_URL=$(cat /run/secrets/MOUHIM_API_URL) amp;amp; 
           export GOOGLE_CLIENT_ID=$(cat /run/secrets/GOOGLE_CLIENT_ID) amp;amp; 
           export GOOGLE_REDIRECT_URI=$(cat /run/secrets/GOOGLE_REDIRECT_URI) amp;amp; 
           export FACEBOOK_CLIENT_ID=$(cat /run/secrets/FACEBOOK_CLIENT_ID) amp;amp; 
           export FACEBOOK_REDIRECT_URI=$(cat /run/secrets/FACEBOOK_REDIRECT_URI) amp;amp; 
           yarn build amp;amp; 
           rm -rf node_modules
 
RUN NODE_ENV=production yarn install 
  --prefer-offline 
  --pure-lockfile 
  --non-interactive 
  --production=true
 
FROM node:alpine
 
WORKDIR /app
 
COPY --from=builder /app  .
 
ENV HOST 0.0.0.0
EXPOSE 3000
 
CMD [ "yarn", "start" ]
 

this is my Github Workflow yml file

 name: Docker
 
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
 
on:
  push:
    branches: [ master ]
    # Publish semver tags as releases.
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ master ]
 
 
env:
  # Use docker.io for Docker Hub if empty
  REGISTRY: ghcr.io
  # github.repository as <account>/<repo>
  IMAGE_NAME: ${{ github.repository }}
 
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
 
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
 
      # Login against a Docker registry except on PR
      # https://github.com/docker/login-action
      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
 
      # Extract metadata (tags, labels) for Docker
      # https://github.com/docker/metadata-action
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
 
      # Build and push Docker image with Buildx (don't push on PR)
      # https://github.com/docker/build-push-action
      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          secrets: |
            "MOUHIM_API_URL=https://example.com/api"
            "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}"
            "GOOGLE_REDIRECT_URI=${{ secrets.GOOGLE_REDIRECT_URI }}"
            "FACEBOOK_CLIENT_ID=${{ secrets.FACEBOOK_CLIENT_ID }}"
            "FACEBOOK_REDIRECT_URI=${{ secrets.FACEBOOK_REDIRECT_URI }}"