GCR - в изображении отсутствуют все файлы, кроме двух, локальное изображение завершено - PullRequest
1 голос
/ 17 июня 2020

У меня есть контейнер, который я развертываю в Kubernetes (GKE), и образ, который я создал локально, хорош и работает, как ожидалось, но похоже, что образ извлекается из реестра контейнеров Google, когда команда запуска измененный на pwd && ls возвращает результат, показанный здесь:

I 2020-06-17T16:24:54.222382706Z /app
I 2020-06-17T16:24:54.226108583Z lost+found
I 2020-06-17T16:24:54.226143620Z package-lock.json

и результат тех же команд при запуске в контейнере локально, с docker run -it <container:tag> bash это:

#${API_CONTAINER} resolves to gcr.io/<project>/container: I.E. tag gets appended

.../# docker run -it ${API_CONTAINER}latest bash   
root@362737147de4:/app# pwd
/app
root@362737147de4:/app# ls
Dockerfile       dist          files  node_modules       package.json  ssh.bat      stop_forever.bat  test      tsconfig.json
cloudbuild.yaml  environments  log    package-lock.json  src           startApi.sh  swagger.json      test.pdf  tsconfig.test.json
root@362737147de4:/app# 

Мои мысли по этому поводу начинаются с того, что либо пу sh в реестре буквально не работает, либо я не тяну правильный, то есть вытаскиваю какой-то тег latest, который был создан облачной сборкой в ​​предыдущей попытке

В чем может быть потенциальная проблема? Что потенциально может решить эту проблему?

Изменить: после использования разных тегов при развертывании, использования --no-cache во время сборки и извлечения из реестра на другом компьютере, я склоняюсь к тому, что у GKE возникла проблема с извлечением образа от ГКЛ. Есть ли способ поместить это в другое место или получить представление о том, что происходит с вытягиванием?

EDIT 2:

Итак, да, у меня есть файл docker, которым я могу поделиться , но имейте в виду, что я унаследовал его и не понимаю, как это было сделано, или почему некоторые шаги были необходимы другому разработчику. (Я определенно заинтересован в его максимально возможном рефакторинге.

FROM node:8.12.0

RUN mkdir /app
WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH

RUN apt-get update && apt-get install snmp -y

RUN npm install --unsafe-perm=true
RUN apt-get update \
    && apt-get install -y \
    gconf-service \
    libasound2 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libc6 \
    libcairo2 \
    libcups2 \
    libdbus-1-3 \
    libexpat1 \
    libfontconfig1 \
    libgcc1 \
    libgconf-2-4 \
    libgdk-pixbuf2.0-0 \
    libglib2.0-0 \
    libgtk-3-0 \
    libnspr4 \
    libpango-1.0-0 \
    libpangocairo-1.0-0 \
    libstdc++6 \
    libx11-6 \
    libx11-xcb1 \
    libxcb1 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxi6 \
    libxrandr2 \
    libxrender1 \
    libxss1 \
    libxtst6 \
    ca-certificates \
    fonts-liberation \
    libappindicator1 \
    libnss3 \
    lsb-release \
    xdg-utils \
    wget

COPY . /app


# Installing puppeteer and chromium for generating PDF of the invoices.


# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update \
    && apt-get install -y wget gnupg libpam-cracklib \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
    && apt-get update \
    && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \
      --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*


# Uncomment to skip the chromium download when installing puppeteer. If you do,
# you'll need to launch puppeteer with:
#     browser.launch({executablePath: 'google-chrome-unstable'})
# ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true

# Install puppeteer so it's available in the container.
RUN npm i puppeteer \
    # Add user so we don't need --no-sandbox.
    # same layer as npm install to keep re-chowned files from using up several hundred MBs more space
    && groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
    && mkdir -p /home/pptruser/Downloads \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app/node_modules

#build the api, and move into place.... framework options are limited with the build.
RUN npm i puppeteer kiwi-server-cli && kc build -e prod
RUN rm -Rf ./environments & rm -Rf ./src && cp -R ./dist/prod/* .


# Run everything after as non-privileged user.
# USER pptruser

CMD ["google-chrome-unstable"] # I have tried adding this here as well "&&", "node", "src/server.js"

Для проталкивания изображения я использую эту команду: docker push gcr.io/<projectid>/api:latest-<version>, и у меня есть настройки учетных данных с cloud auth configure-docker, и вот дезинфицированный версия манифеста yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert -f ./docker-compose.yml
    kompose.version: 1.21.0 ()
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: api
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert -f ./docker-compose.yml
        kompose.version: 1.21.0 ()
      creationTimestamp: null
      labels:
        io.kompose.service: api
    spec:
      containers:
      - args:
        - bash
        - -c
        - node src/server.js
        env:
        - name: NODE_ENV
          value: production
        - name: TZ
          value: America/New_York
        image: gcr.io/<projectId>/api:latest-0.0.9
        imagePullPolicy: Always
        name: api
        ports:
        - containerPort: 8087
        resources: {}
        volumeMounts:
        - mountPath: /app
          name: api-claim0
        - mountPath: /files
          name: api-claim1
      restartPolicy: Always
      serviceAccountName: ""
      volumes:
      - name: api-claim0
        persistentVolumeClaim:
          claimName: api-claim0
      - name: api-claim1
        persistentVolumeClaim:
          claimName: api-claim1
status: {}

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Управление изображениями [1] включает перечисление изображений в репозитории, добавление тегов, удаление тегов, копирование изображений в новый репозиторий и удаление изображений. Я надеюсь, что документы по устранению неполадок [2] могут быть полезны для устранения проблемы.

[1] https://cloud.google.com/container-registry/docs/managing

[2] https://cloud.google.com/container-registry/docs/troubleshooting

0 голосов
/ 18 июня 2020

Решение исходит из первоначального замысла файла docker-compose.yml, который был преобразован в манифест kubernetes с помощью инструмента под названием kompose. Исходный файл docker -compose был предназначен для разработки и, как таковой, имел переопределения для pu sh локальной среды разработки в работающем контейнере.

Это было из-за этого в файле yml:

services:
  api:
    build: ./api
    volumes:
      - ./api:/app
      - ./api/files:/files

, что переводится в манифест kubernetes:

      volumeMounts:
      - mountPath: /app
        name: api-claim0
      - mountPath: /files
        name: api-claim1
      volumes:
      - name: api-claim0
        persistentVolumeClaim:
          claimName: api-claim0
      - name: api-claim1
        persistentVolumeClaim:
          claimName: api-claim1

Который Kubernetes не имеет файлов для предоставления, и приложение по существу перезаписывается пустым томом, поэтому файл не найдено.

удаление директив в манифесте кубернетов привело к успеху.

Напоминание всем нам, чтобы мы были внимательны.

...