Изменить версию узла, используя nvm и docker -compose - PullRequest
0 голосов
/ 09 марта 2020

У меня есть Dockerfile, который запускает centos / systemd, который также устанавливает nvm и имеет точку входа. sh, который запускает / usr / sbin / init (как того требует документация), он также принимает аргумент из команды docker -compose для контролировать используемую версию узла - НО кажется, что версия узла не является постоянной / по какой-то причине сохраняется.

Как я могу контролировать версию узла из docker -композитного файла?

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 -составить:

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

docker -создать up (вывод):

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

docker exe c -it / bin / sh -l c "node --version":

v13.10.0

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

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

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

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

0 голосов
/ 11 марта 2020

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

...