我有一个运行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
型
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“node --version”:
v13.10.0
型
谢谢你,谢谢
2条答案
按热度按时间pkwftd7m1#
如果你为每个项目创建一个dockerfile,那么,合并将它们与docker-compose文件结合起来,对于每个部署,这是你最好的选择。如果你想促进代码重用,你可以考虑创建一个通用的基础镜像,所有的dockerfile都使用它。
qvsjd97n2#
在网上无休止的搜索后,我提出了自己的问题。需要注意/改变的两件事:
1.我们还需要设置默认节点版本(在shell脚本中)。不幸的是,我不知道为什么有必要将其设置为默认值以保持其持久性,但它只是工作(如果有人可以解释,请这样做)。因此entrypoint.sh看起来像这样:
字符串
1.当运行bash与
docker exec -it <container_id> /bin/sh -c "node --version"
,而不是在交互模式或登录到 shell ,它不会读取启动脚本,所以节点版本设置使用source /root/.nvm/nvm.sh
和nvm use XXX
是不是红色的,这就是为什么它没有“改变”为这个特定的bash会话。解决方案是登录到容器,并运行node --version
从内部或源nvm.sh以及之前运行节点-版本,例如docker exec -it <container_id> sh -c "source /root/.nvm/nvm.sh && node --version"
希望这对遇到同样问题的人有所帮助。