使用 nvm 和 docker-compose 更改节点版本

问题描述 投票:0回答:2

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

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

Dockerfile:

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"]

入口点.sh:

#!/bin/bash
source root/.nvm/nvm.sh && nvm use "$@"
node --version
exec /usr/sbin/init

docker-compose:

version: '3'
services:
  httpd:
    build: '..\Web-Server\Apache'
    privileged: true
    ports:
      - 80:80
      - 443:443
    command: 11.9.0

docker-compose up(输出):

httpd_1  | Now using node v11.9.0 (npm v6.5.0)
httpd_1  | v11.9.0

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

v13.10.0

谢谢!

docker docker-compose nvm
2个回答
0
投票

如果您为每个项目创建一个 dockerfile,然后将它们与 docker-compose 文件结合起来,对于每个部署,这是您的最佳选择。如果您想促进代码重用,您可以考虑创建一个供所有 dockerfile 使用的通用基础映像。


0
投票

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

  1. 我们还需要设置默认的节点版本(在 shell 脚本内)。不幸的是,我不知道为什么有必要将其设置为默认值以保持其持久性,但它确实有效(如果有人可以解释这一点,请这样做)。所以entrypoint.sh看起来像这样:
#!/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.sh
    nvm use XXX
    设置的节点版本不是红色的,这就是为什么它没有针对此特定“更改” bash 会话。解决方案是登录到容器并从或源 nvm.sh 中运行
    node --version
    ,然后再运行 node --version 例如
    docker exec -it <container_id> sh -c "source /root/.nvm/nvm.sh && node --version"

希望对遇到同样问题的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.