【发布时间】:2020-03-09 12:41:19
【问题描述】:
我有一个运行 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"]
entrypoint.sh:
#!/bin/bash
source root/.nvm/nvm.sh && nvm use "$@"
node --version
exec /usr/sbin/init
码头工人撰写:
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 "node --version":
v13.10.0
谢谢!
【问题讨论】:
-
一个 Docker 镜像通常会做一个的事情。例如,您实际上没有任何理由在 Dockerfile 中安装三个版本的 Node,因为容器运行的单个应用程序只会使用其中一个。不要使用
nvm之类的版本管理器,直接安装你需要的单一版本的Node作为镜像内的“系统”Node即可。 -
这是开发设置,我有不同的项目需要不同的版本
-
每个项目都可以有自己的
Dockerfile来适应这种情况。 -
由于我有多个项目有多种需求,每个项目运行几个容器,想法是创建几个容器,然后将每个项目与 docker-compose 混合匹配。为每个节点版本创建不同的 docker 文件将使其难以维护,因为该容器还运行 apache 和收费的其他服务,因此每次与节点无关的更改都会让我修改所有 docker 文件。我真的希望该命令能够正常工作...除了我所描述的其他所有内容都可以正常工作。
标签: docker docker-compose nvm