Создание тома в пользовательском образе Docker на GCP, приводящее к ошибке - PullRequest
1 голос
/ 20 октября 2019

У меня есть Angular приложение с Cypress. Я хотел создать простую конвейерную конфигурацию на Google Cloud Build.

images:
  - 'gcr.io/$PROJECT_ID/e2e-tests'

steps:
  # Install node_modules
  - name: node:10.16.3
    entrypoint: npm
    args: ['ci']
    id: install

  # Run linters
  - name: node:10.16.3
    entrypoint: npm
    args: ['run', 'lint']
    id: lint
    waitFor:
      - install

  # Run unit tests
  - name: node:10.16.3
    entrypoint: npm
    args: ['test']
    id: test
    waitFor:
      - lint

  # Run e2e tests
  - name: 'gcr.io/cloud-builders/docker'
    args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/e2e-tests', '-f', 'docker/cypress/Dockerfile', '.' ]
    id: e2e
    waitFor:
      - lint

  # Build app for prod
  - name: node:10.16.3
    entrypoint: npm
    args: ['build']
    id: build
    waitFor:
      - test
      - e2e

К сожалению, я не могу использовать встроенный npm образ, потому что Cypress требует установки некоторых дополнительных библиотек. Вот почему я начал создавать свой собственный образ.

# THIS ONE IS WORKING

FROM node:lts

RUN apt-get update && \
  apt-get install -y \
    libgtk2.0-0 \
    libnotify-dev \
    libgconf-2-4 \
    libnss3 \
    libxss1 \
    libasound2 \
    xvfb

ENV PATH /app/node_modules/.bin:$PATH
ENV CI=1

WORKDIR /app
COPY . /app

RUN npm ci
RUN npm run e2e:ci

Он работал, когда я копировал приложение в контейнер. Но мне нужно установить зависимости еще раз, поэтому я решил заменить COPY на VOLUME, чтобы ускорить весь процесс.

# THIS ONE GETS AN ERROR LISTED BELOW

FROM node:lts

RUN apt-get update && \
  apt-get install -y \
    libgtk2.0-0 \
    libnotify-dev \
    libgconf-2-4 \
    libnss3 \
    libxss1 \
    libasound2 \
    xvfb

ENV PATH /app/node_modules/.bin:$PATH
ENV CI=1

VOLUME . /app

WORKDIR /app

RUN npm run e2e:ci

Журнал GCB (сначала самый новый):

OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"apply apparmor profile: apparmor failed to apply profile: open /proc/self/attr/exec: no such file or directory\"": unknown
---> Running in be2a7992ad86
Step 7/7 : RUN npm run e2e:ci
---> 4fc9a0a86172
Removing intermediate container 53ee0d15063f
---> Running in 53ee0d15063f
Step 6/7 : WORKDIR /app
---> dd7298b536a0
Removing intermediate container 7f15a02f79e2
---> Running in 7f15a02f79e2
Step 5/7 : VOLUME . /app
---> 63124861eb3d
Removing intermediate container 28231f3bbf16
---> Running in 28231f3bbf16
Step 4/7 : ENV CI=1
---> a2563c01781f
Removing intermediate container 1579023b86b1
---> Running in 1579023b86b1
Step 3/7 : ENV PATH /app/node_modules/.bin:$PATH
---> d765db9e3ddf
Removing intermediate container a0ac5fd5da98
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up notification-daemon (3.20.0-1+b1) ...
Setting up libgtk-3-bin (3.22.11-1) ...
Setting up libgtk-3-0:amd64 (3.22.11-1) ...
Setting up librest-0.7-0:amd64 (0.8.0-2) ...
...

Что я делаю не так?

1 Ответ

2 голосов
/ 21 октября 2019

Когда вы используете команду RUN, вы запускаете команду во время BUILD контейнера. Как и apt-get, который вы выполняете: вы запускаете установку пакетов.

Когда вы создаете свой собственный Cloud Builder, вы не можете установить том во время сборки контейнера. Таким образом, вам не нужно запускать команду.

Замените RUN в конце на ENTRYPOINT, который определяет команду по умолчанию, запускаемую при выполнении контейнера.

Затем, когда вы используете свой контейнер, не забудьтеуказать громкость

...