【问题标题】:How to setup a older meteor version in dockerfile, and docker container如何在 dockerfile 和 docker 容器中设置较旧的流星版本
【发布时间】:2021-12-01 12:42:13
【问题描述】:

我在本地有一个使用流星和 node.js 运行的项目。 meteor版本是2.4,node.js版本是8.9.4,我有meteor/release文件把meteor版本设为2.2,这样meteor和node就可以协同工作了。

(base) xxx$ meteor --version
Meteor 2.4
(base) xxx$ node -v
v8.9.4

看起来不错,所以我将此项目部署到 docker 容器到服务器。我写的Dockerfile第一行

# node version dependent on meteor version
FROM node:8.9.4

成功部署后,docker日志显示错误siad。

Waiting for mongodb server to start - sleeping
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: /app/bundle/main.js
error:   undefined
data:    /app/bundle/main.js:34 - Meteor requires Node v12.0.0 or later.
data:    /app/bundle/main.js:34 - error: Forever detected script exited with code: 1

我在docker里面查了一下,node版本是8.9.4

(base) [xxx]$  docker exec -it -u root tblbuilder_meteor_1 /bin/bash -c 'node --version'
v8.9.4

所以我假设它是流星版本。但首先我不知道如何检查 docker 内的流星版本。其次,为什么会发生这种情况?我确定发布文件已更新为推送项目文件夹。

在一些伟人的帮助下,我有点明白了。在本地我使用meteor 2.2,在docker文件中我使用node.js 8.9.4与meteor2.2一起工作。所以我剩下的就是修改 DOCKERFILE,将它从节点 8.9.4 更改为节点 12。下面是我的 Dockerfile 文件,我尝试将其更改为节点 12.22.2,但它一直给我错误,我花了一天时间解决它们。目前,我堆叠在安装 r-base 部分。 是否有一些将节点 8 更改为节点 12 的指南。

# node version dependent on meteor version
FROM node:8.9.4
# I am going to use 12.22.2
#FROM node:12.22.2

# (even if copied as root you still need to change)
# https://github.com/moby/moby/issues/6119
COPY ./compose/meteor/entrypoint.sh /entrypoint.sh
COPY ./compose/meteor/run_app.sh /run_app.sh
COPY ./compose/meteor/r-cran.pgp /r-cran.pgp
COPY ./settings/settings.json /app/settings.json
COPY ./requirements.txt /requirements.txt
COPY ./r_requirements.sh /r_requirements.sh

# set locale to utf8: https://github.com/docker-library/docs/pull/703/files
# added [check-valid-until=no] & Acquire::Check-Valid-Until "false"; https://unix.stackexchange.com/questions/508724/failed-to-fetch-jessie-backports-repository
# Needs work to bring it up-to-date
RUN \
    echo "deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list && \
    sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list && \
    apt-get -o Acquire::Check-Valid-Until=false update && \
    \
    sh -c 'echo "deb [check-valid-until=no] http://cran.rstudio.com/bin/linux/debian jessie-cran35/" >> /etc/apt/sources.list' && \
    apt-key add /r-cran.pgp && \
    \
    apt-get -o Acquire::Check-Valid-Until=false update && \
    apt-get -o Acquire::Check-Valid-Until=false install -y locales && \
    \
    localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 && \
    export LC_ALL=en_US.UTF-8 && \
    export LANG=en_US.UTF-8 && \
    export LANGUAGE=en_US.UTF-8

ENV LANG en_US.utf8
ENV LC_ALL en_US.UTF-8

# add rstudio debian install for R (requires version >3.3)
# https://cran.r-project.org/bin/linux/debian/
# install R from apt-get
# install python 3.6 from source :/

RUN apt install -y --force-yes r-base-core r-recommended r-base-html r-base-core

RUN apt-get install -y --force-yes wget bsdtar r-base r-base-dev && \
    apt-get clean && \
    \
    wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz && \
    tar zxf Python-3.6.5.tgz && \
    cd ./Python-3.6.5 && \
    ./configure && \
    make && \
    make altinstall && \
    cd .. && \
    rm Python-3.6.5.tgz && \
    rm -rf ./Python-3.6.5

# create paths and users
# change executable permissions
RUN npm install forever -g && \
    \
    mkdir -p /app/production && \
    mkdir -p /app/logs && \
    mkdir -p /app/crons && \
    \
    groupadd -r app && \
    useradd -m -d /home/app -g app app && \
    \
    chmod +x /entrypoint.sh && \
    chmod +x /run_app.sh && \
    chmod +x /r_requirements.sh && \
    chmod +x /requirements.txt && \

    \
    chown -R app:app /app && \
    chown app:app /entrypoint.sh && \
    chown app:app /run_app.sh && \
    chown app:app /r_requirements.sh &&\
    chown app:app /requirements.txt

USER app

# 1) install R packages
# 2) install python packages
RUN export "R_LIBS=/home/app/R_libs" && \
    mkdir /home/app/R_libs && \
    bash /r_requirements.sh && \
    \
    /usr/local/bin/pip3.6 install --user -r /requirements.txt

USER root
COPY ./compose/meteor/src/src.tar.gz /app/src.tar.gz
COPY ./src/private /app/src/private
RUN chown -R app:app /app

USER app
RUN cd /app && \
    bsdtar -xzvf src.tar.gz && \
    npm install --prefix /app/bundle/programs/server --production

ENTRYPOINT ["/entrypoint.sh"]

【问题讨论】:

    标签: docker meteor dockerfile


    【解决方案1】:

    你的测试中有很多错误的理解:

    1. 您的 Meteor 版本是 2.2,因为是您项目中的版本;
    2. 你看这个 Meteor 项目的 Node 版本,看看这个答案,很多人发给你Meteor Docker Node.js version is not match
    3. 通常,我们构建 Meteor,这意味着将其转换为 NodeJS 包构建,然后在 Docker 内部不需要 Meteor。
    4. 我们需要查看您的 Dockerfile 并了解您构建 Docker 映像的过程。

    【讨论】:

    • 谢谢你。我现在有点明白了。在本地我使用meteor 2.2,没有node.js。部署时,我使用 node.js 8.9.4,因为我是在 dockerfile 中编写的。 Meteor 2.2 需要节点 12 或更高版本。所以我的问题是修改dockerfile。但是我试了一整天,还是没有全部通过。主要堆叠在安装 r-base 部分。
    • @ZicongWang,给我看看你的 Dockerfile。
    • 如果你能看到,我将它添加到我的帖子中。我的帖子结束。
    • 我查看了您的 Dockerfile。我了解到您将许多应用程序放在同一个 docker 映像中,对吗?我认为这不是一个好主意,正是因为您现在使用不同的节点版本时遇到了这个问题。
    • 当您使用 Docker 时,如果可能,最佳实践是在不同的 docker 中提供不同的服务。因此,您可以更新每一个而不影响另一个。我知道现在对你来说很难,但我认为是最好的方法,分成更多的容器。
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多