首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用nvm和docker-组合更改节点版本

使用nvm和docker-组合更改节点版本
EN

Stack Overflow用户
提问于 2020-03-09 12:41:19
回答 2查看 6.2K关注 0票数 2

我有一个运行centos/systemd的Dockerfile,它也安装了nvm,并且有一个运行/usr/sbin/init (按照docs的要求)的entrypoint.sh,它还接受来自docker的一个参数--复合命令来控制正在使用的节点版本--但是由于某种原因,节点版本似乎没有持久/保留。

如何从docker-组合文件控制节点版本?

Dockerfile:

代码语言:javascript
复制
FROM centos/systemd

# Install & enable httpd
RUN yum -y update
RUN yum -y install \
    httpd \
    autofs \
    gcc-c++ \
    make \
    git \
    fontconfig \
    bzip2 \
    libpng-devel \
    ruby \
    ruby-devel \
    zip \
    unzip
RUN yum clean all
RUN systemctl enable httpd.service

# Setting up virtual hosts
RUN echo "IncludeOptional apps/*.conf" >> /etc/httpd/conf/httpd.conf

# Install nvm to later use in compose
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 13.10.0
RUN curl --silent -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

# install node and npm
RUN source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm install 12.16.1 \
    && nvm install 11.9.0 \
    && nvm install 10.9.0 \
    && nvm alias default $NODE_VERSION \
    && nvm use default

# add node and npm to path so the commands are available
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

# Expose ports
EXPOSE 80
EXPOSE 443

COPY entrypoint.sh ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh:

代码语言:javascript
复制
#!/bin/bash
source root/.nvm/nvm.sh && nvm use "$@"
node --version
exec /usr/sbin/init

码头工人-组成:

代码语言:javascript
复制
version: '3'
services:
  httpd:
    build: '..\Web-Server\Apache'
    privileged: true
    ports:
      - 80:80
      - 443:443
    command: 11.9.0

码头工人-组成(输出):

代码语言:javascript
复制
httpd_1  | Now using node v11.9.0 (npm v6.5.0)
httpd_1  | v11.9.0

docker -it /bin/sh -lc“节点-版本”:

代码语言:javascript
复制
v13.10.0

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-03-11 09:02:32

如果您为每个项目创建了一个dockerfile,那么,将它们与dockerfile文件结合起来,对于每个部署来说,这是您最好的选择。如果您希望为代码重用提供便利,可以考虑创建一个通用的基本映像,所有的dockerfile都会对其使用。

票数 0
EN

Stack Overflow用户

发布于 2020-03-11 09:06:30

在网上无休止的搜索之后,回答我自己的问题。有2件事需要注意/改变:

  1. 我们还需要设置默认的节点版本(在shell脚本中)。不幸的是,我不知道为什么有必要将其设置为默认,以保持它的持久性,但它只是起作用(如果有人可以解释这一点,请解释)。所以entrypoint.sh看起来是这样的:

代码语言:javascript
复制
#!/bin/bash
source root/.nvm/nvm.sh && nvm use "$@" && nvm alias default "$@"
node --version
exec /usr/sbin/init

  1. 在使用docker exec -it <container_id> /bin/sh -c "node --version"运行bash时,不以交互模式运行,也不会登录shell,因此不会读取启动脚本,因此使用source /root/.nvm/nvm.shnvm use XXX设置的节点版本不会是红色的,这就是为什么这个特定bash会话没有“更改”的原因。解决方案是在运行节点-版本(如docker exec -it <container_id> sh -c "source /root/.nvm/nvm.sh && node --version"

)之前,登录到容器并在OR源nvm.sh中运行node --version

希望这对任何遇到同样问题的人都有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60600790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档