Создание пользовательского образа NodeJSDocker на rhel7

Я создаю несколько базовых образов Docker для своей организации, которые будут использоваться командами приложений при развертывании своих приложений в OpenShift. Один из образов, которые мне нужно сделать, — это образ NodeJS (мы хотим, чтобы наши образы были внутренними, а не получены из DockerHub). Я использую универсальный базовый образ RedHat RHEL7 (ubi). Однако у меня возникли проблемы с настройкой NodeJS для работы в контейнере. Вот мой Dockerfile:

FROM myimage_rhel7_base:1.0

USER root

RUN INSTALL_PKGS="rh-nodejs10 rh-nodejs10-npm rh-nodejs10-nodejs-nodemon nss_wrapper" && \
    yum install -y --setopt=tsflags=nodocs $INSTALL_PKGS && \
    rpm -V $INSTALL_PKGS && \
    yum clean all

USER myuser

Однако, когда я запускаю образ, нет доступных команд node или npm, если я не запускаю scl enable rh-nodejs10 bash. Это не работает в Dockerfile, так как создает подоболочку, которую не может использовать пользователь, обращающийся к контейнеру.

Я попытался установить из исходного кода, но столкнулся с другой проблемой, связанной с необходимостью обновления версий gcc/g++, несмотря на то, что они недоступны в моих настроенных репозиториях из моей организации. Я также полагаю, что если я смогу заставить NodeJS работать из менеджера пакетов, это поможет получить исправления безопасности и такие, если пакет будет обновлен.

Мой вопрос: каковы рекомендуемые шаги для создания образа, который можно использовать для создания приложений, работающих на NodeJS?


person willh99    schedule 06.08.2019    source источник


Ответы (2)


Возможно, это тот случай, когда лучший код — это код, который вы вообще не пишете. Взгляните на https://github.com/sclorg/s2i-nodejs-container

Это проект, который создает образ с установленным nodejs. Это может быть идеальным готовым решением или отличным примером того, что вы пытаетесь создать.

Кроме того, их readme пытается описать, как они обходят команду scl enable.

Обычно SCL требует ручного управления, чтобы включить коллекцию, которую вы хотите использовать. Это обременительно и может привести к ошибкам. Подход OpenShift S2I заключается в установке переменных среды Bash, которые служат для автоматического включения нужной коллекции:

  • BASH_ENV: включает сбор для всех неинтерактивных сеансов Bash.
  • ENV: включает сбор для всех вызовов /bin/sh
  • PROMPT_COMMAND: включает коллекцию в интерактивной оболочке

Два примера: * Если вы укажете BASH_ENV, то все ваши #!/bin/bash скрипты не должны вызывать scl enable. * Если указать PROMPT_COMMAND, то при выполнении команды podman exec ... /bin/bash коллекция будет автоматически включена.

person Adam Wise    schedule 08.08.2019

В конце концов я решил установить узел, используя бинарники, а не наш сервер rpm. Вот реализация

FROM myimage_rhel7_base:1.0

USER root

# Get node distribution from nexus and install it
RUN   wget -P /tmp http://myrepo.example.com/repository/node/node-v10.16.3-linux-x64.tar.xz && \
      tar -C /usr/local --strip-components 1 -xf /tmp/node-v10.16.3-linux-x64.tar.xz && \
      rm /tmp/node-v10.16.3-linux-x64.tar.xz


person willh99    schedule 18.09.2019