Измените версию узла с помощью nvm и docker-compose

У меня есть Dockerfile под управлением centos / systemd, который также устанавливает nvm и имеет точку входа. Sh, который запускает / usr / sbin / init (в соответствии с требованиями документации), он также принимает аргумент от команды 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"]

entrypoint.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

Спасибо!


person Ariel Morry    schedule 09.03.2020    source источник
comment
Образ Docker обычно выполняет одну вещь. Например, у вас нет никаких причин устанавливать три версии Node в Dockerfile, потому что одно приложение, запускаемое контейнером, будет использовать только одну из них. Не используйте диспетчер версий, такой как nvm, просто установите единственную версию Node, которая вам нужна, в качестве «системного» узла внутри образа.   -  person David Maze    schedule 09.03.2020
comment
Это настройка для разработки, и у меня разные проекты, требующие разных версий.   -  person Ariel Morry    schedule 09.03.2020
comment
Для этого в каждом проекте может быть свой Dockerfile.   -  person David Maze    schedule 09.03.2020
comment
Поскольку у меня есть несколько проектов с несколькими потребностями, каждый из которых запускает несколько контейнеров, идея состоит в том, чтобы создать несколько контейнеров, а затем смешать и сопоставить каждый проект с помощью docker-compose. Создание отдельного файла докеров для каждой версии узла затруднит обслуживание, поскольку этот контейнер также запускает apache и другие службы, поэтому каждое изменение, не связанное с узлом, заставит меня изменить все файлы докеров. Я очень надеюсь, что эта команда заработает ... За исключением того, что все остальное, что я описал, работает отлично.   -  person Ariel Morry    schedule 10.03.2020


Ответы (2)


Если вы создаете файл dockerfile для каждого проекта, объедините их с файлами docker-compose для каждого развертывания, это ваш лучший вариант. Если вы хотите упростить повторное использование кода, вы можете создать общий базовый образ, который используют все ваши файлы докеров.

person Thomas Bigger    schedule 11.03.2020

Отвечая на свой вопрос после бесконечных поисков в Интернете. 2 вещи, которые следует отметить / изменить:

  1. Нам также нужно установить версию узла по умолчанию (внутри сценария оболочки). К сожалению, я не понимаю, почему необходимо установить его по умолчанию, чтобы он оставался постоянным, но он просто работает (если кто-то может это объяснить, сделайте это). Итак, entrypoint.sh выглядит так:
#!/bin/bash
source root/.nvm/nvm.sh && nvm use "$@" && nvm alias default "$@"
node --version
exec /usr/sbin/init
  1. при запуске bash с docker exec -it <container_id> /bin/sh -c "node --version", а не в интерактивном режиме или при входе в оболочку, он не будет читать сценарии запуска, поэтому версия узла, установленная с помощью source /root/.nvm/nvm.sh и nvm use XXX, не является красной, и поэтому она не "изменена" для этого конкретного сеанса bash. Решение состоит в том, чтобы войти в контейнер и запустить node --version из ИЛИ источника nvm.sh перед запуском node --version, например. docker exec -it <container_id> sh -c "source /root/.nvm/nvm.sh && node --version"

Надеюсь, что это поможет всем, кто сталкивался с той же проблемой.

person Ariel Morry    schedule 11.03.2020