我正在为我的组织构建一些基本的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上运行的应用程序的映像的建议步骤是什么?
答案 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