在rhel7上创建自定义NodeJSDocker图像

时间:2019-08-06 17:10:27

标签: node.js docker redhat yum

我正在为我的组织构建一些基本的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,否则没有npmscl enable rh-nodejs10 bash命令可用。这在Dockerfile中不起作用,因为它创建了一个子外壳,该子外壳将对访问该容器的用户不可用。

我尝试从源代码安装,但是遇到了另一个问题,尽管我的组织配置的存储库中没有gcc / g ++版本,但仍需要升级它们。我还认为,如果可以从程序包管理器中使NodeJS正常运行,它将有助于获取安全补丁,并且应该对程序包进行更新。

我的问题是,创建可用于构建在NodeJS上运行的应用程序的映像的建议步骤是什么?

2 个答案:

答案 0 :(得分:0)

可能的情况是,最好的代码是根本不编写的代码。看看https://github.com/sclorg/s2i-nodejs-container

这是一个创建安装了nodejs的映像的项目。这可能是开箱即用的完美解决方案,也可以作为您尝试构建的一个很好的例子。

此外,他们的自述文件试图描述如何绕过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命令时,集合将自动   启用。

答案 1 :(得分:0)

我最终决定使用二进制文件而不是我们的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