Команда npm не обнаружила ошибку при запуске контейнера Docker

Я пытаюсь что-то сделать с изображением gitlab-runner,

    FROM gitlab/gitlab-runner:alpine
    WORKDIR /app
    COPY . /app
    RUN apk add yarn && yarn install

    RUN yarn --version        # this layer prints 1.16.0

    RUN ng build --prod
    EXPOSE 3000
    CMD ["yarn", "run", "start"]

выше это файл докера, который я создал

    docker build -t runner:1 .

Я смог успешно построить образ

    docker run -p 3000:3000 runner:1

но когда я пытаюсь запустить контейнер, он выдает ошибку ниже

`*FATAL: Command yarn not found.*`

не уверен в поведении, если он может установить пряжу (apk add yarn) в базовые образы и установить зависимости с помощью yarn install, то как он не может найти команду пряжи при запуске контейнера? Где я ошибаюсь.

Также в каком каталоге пряжа установлена ​​​​в альпийском?

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


person Dan    schedule 28.05.2020    source источник
comment
проверьте, есть ли пряжа или нет, используя yarn --version, добавив строку.   -  person Harsh Manvar    schedule 28.05.2020
comment
В контейнере присутствует пряжа @HarshManvar, я проверил, добавив слой (RUN yarn --version) в файл докера, и в ответ я получил (1.16.0) . знаете ли вы каталог, в котором он установлен в альпийском?   -  person Dan    schedule 28.05.2020
comment
Это может быть совершенно не связано, но почему вы используете gitlab/gitlab-runner:alpine, а не alpine?   -  person Blusky    schedule 28.05.2020
comment
@Blusky Я планирую интегрировать приложение с регистрацией gitlab runner   -  person Dan    schedule 28.05.2020


Ответы (2)


Выводит версию. Это означает, что пряжа уже установлена. Вы можете найти путь так же, как и версию.

RUN which yarn

Step 6/10 : RUN which yarn
 ---> Running in 0f633b81f2ed
/usr/bin/yarn

Мы видим, что /usr/bin/ добавилось к PATH.

 Step 7/11 : RUN echo $PATH
 ---> Running in fc3f40b6bfd9
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Но я не мог понять, почему не читает пряжу из PATH.

Итак, мы явно указали PATH в нашем Dockerfile.

ENV PATH=${PATH} 

Но тем не менее, проблема сохраняется. Теперь нам нужно разделить пряжу и команды как ENTRYPOINT и CMD соответственно в Dockerfile.

ENTRYPOINT ["yarn"]
CMD ["run", "start"]

Обновленный Dockerfile

FROM gitlab/gitlab-runner:alpine

ENV PATH=${PATH}

WORKDIR /app
COPY . /app
RUN apk add yarn && yarn install

RUN yarn --version        # this layer prints 1.16.0
RUN ng build --prod

EXPOSE 3000
ENTRYPOINT ["yarn"]
CMD ["run", "start"]
---

$ docker run -p 3000:3000 harik8/yarn:latest 
yarn run v1.16.0
error Couldn't find a package.json file in "/app"
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Поведение базового образа выглядит необычно. Лучше бы пройти через это.

person hariK    schedule 29.05.2020
comment
В этой настройке вы замените gitlab runner на приложение. Это цель? - person Miq; 29.05.2020
comment
Я добавил точку входа, и это сработало, и вы правы, поведение неожиданное, но все еще не может отменить и почему он не идет по пути пряжи. - person Dan; 31.05.2020

Для создания своего приложения вы должны использовать не образ gitlab-runner, а образ узла.

Образ Gilab-runner предназначен для запуска агента gitlab, который можно подключить к механизму докеров и создать контейнер узла, в котором вы будете выполнять свою сборку, в вашем случае — сборку образа докера.

Чтобы использовать gilab, вам нужно подготовить файл gitlab-ci, в котором вы определите, какие шаги и какие «сервисы» вам нужны для сборки.

Tl;dr: измените базовый образ на node:latest и в качестве совершенно отдельной рабочей установки gitlab runner.

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

Сначала используйте node:latest image для сборки приложения, а затем скопируйте выходные данные сборки в gitlab-runner.

Образы среды выполнения, такие как gitlab-runner, удалены из инструментов сборки, таких как пряжа или npm, поэтому ваш образ не работает. Основная цель состоит в том, чтобы образы во время выполнения были как можно меньше, а SDK не нужны, а иногда и опасны, когда дело доходит до работы на уровне производства.

person Miq    schedule 28.05.2020
comment
@Mig спасибо, что поделились подробностями, но есть ли способ запустить приложение, используя только изображения gitlab-runner, я использовал его из-за необходимости. есть ли другой способ запустить его? - person Dan; 29.05.2020
comment
Контейнеры Docker предназначены для запуска только одного приложения и закрытия при выходе из приложения. Теоретически вы могли бы, но это настоятельно не рекомендуется. В чем причина требования? Я бы предложил переосмыслить это. - person Miq; 29.05.2020