【问题标题】:Docker image erorr bin not found after npm installationnpm 安装后找不到 Docker 镜像错误 bin
【发布时间】:2020-03-11 07:35:48
【问题描述】:

我需要扩展一个 Dockerfile 并向其添加 grunt。我做了以下事情:

这个 docker 按原样运行

    FROM openjdk:8-jdk-slim
    ARG ND=v12.13.0

    RUN apt-get update && \
        apt-get install --yes --no-install-recommends curl  && \

        NODE_H=/opt/nodejs; mkdir -p ${NODE_H} && \
        curl --fail --silent --output - "http://nodejs.org/dist/${ND}/node-${ND}-linux-x64.tar.gz" \
         | tar -xzv -f - -C "${NODE_H}" && \
        ln -s "${NODE_H}/node-${ND}-linux-x64/bin/npm" /usr/local/bin/npm && \
        ln -s "${NODE_H}/node-${ND}-linux-x64/bin/node" /usr/local/bin/node && \
        ln -s "${NODE_H}/node-${ND}-linux-x64/bin/npx" /usr/local/bin/ && \



    npm install grunt-cli -g

    RUN grunt -v

我还放了以下无济于事的...

ENV PATH="$PATH:/usr/local/bin"

当我运行命令grunt-v 时,出现以下错误:

/bin/sh: 1: grunt: not found

我也尝试通过npm install grunt -g 安装 grunt,但没有成功。知道如何解决吗?

来自 docker build 的 grunt 输出

/opt/nodejs/node-v12.13.0-linux-x64/bin/grunt -> /opt/nodejs/node-v12.13.0-linux-x64/lib/node_modules/grunt-cli/bin/grunt
+ grunt-cli@1.3.2

我需要 grunt 命令在此 docker 映像中可用

我无法更改 docker 映像,即表单 jdk...这是给定的

更新

我也尝试过 VonC 的建议,但仍有问题,

FROM openjdk:8-jdk-slim


ARG ND=v12.13.0

RUN apt-get update && \
    apt-get install --yes --no-install-recommends curl  && \

    # install node
    NODE_HOME=/opt/nodejs; mkdir -p ${NODE_HOME} && \
    curl --fail --silent --output - "http://nodejs.org/dist/${ND}/node-${ND}-linux-x64.tar.gz" \
     | tar -xzv -f - -C "${NODE_HOME}" && \
    ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/node" /usr/local/bin/node && \
    ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/npm" /usr/local/bin/npm && \
    ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/npx" /usr/local/bin/ && \



    npm install -g grunt-cli

ENV PATH="${PATH}:/usr/local/bin"
RUN ls /usr/local/bin/
RUN grunt -v

ls 命令返回


docker-java-home
node
npm
npx

知道缺少什么吗?

【问题讨论】:

  • 你能从一个node 基础镜像开始,它会正确设置所有标准路径吗?
  • @DavidMaze - 谢谢,但这是给定的,我无法更改它,没有办法将它与现有的 java 映像一起使用?
  • @Jhon D - 当然,有一种方法可以处理给定的图像,但节点基础图像很可能更适合。基于您的基本图像(openjdk:8-jdk-slim)的工作示例在我的回答中
  • @John D:您是否根据提供的答案使其正常工作,还是还有未解决的问题?

标签: node.js docker path gruntjs dockerfile


【解决方案1】:

这将起作用:

FROM openjdk:8-jdk-slim


ARG ND=v12.13.0

RUN apt-get update && \
    apt-get install --yes --no-install-recommends curl \
    && NODE_HOME=/opt/nodejs; mkdir -p ${NODE_HOME} \
    && curl --fail --silent --output - "http://nodejs.org/dist/${ND}/node-${ND}-linux-x64.tar.gz" \
     | tar -xzv -f - -C "${NODE_HOME}" \
    &&  ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/node" /usr/local/bin/node \
    && ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/npm" /usr/local/bin/npm \
    && ln -s "${NODE_HOME}/node-${ND}-linux-x64/bin/npx" /usr/local/bin/ \
    && npm install --prefix /usr/local/ -g grunt-cli

ENV PATH="${PATH}:/usr/local/bin"
RUN ls /usr/local/bin
RUN grunt -v

使用 --prefix 将告诉 npm 在 /usr/local/bin 中安装 grunt

ls 输出:

Step 5/6 : RUN ls /usr/local/bin
 ---> Running in 96493743512d
docker-java-home
grunt
node
npm
npx

grunt -v 输出:

Step 6/6 : RUN grunt -v
 ---> Running in c6248c4fce6c
grunt-cli: The grunt command line interface (v1.3.2)

【讨论】:

  • 它可以工作,但/usr/local/bin 已经在openjdk:8-jdk-slim 的路径中,不需要ENV PATH="${PATH}:/usr/local/bin"
  • 是的,我只复制问题中的文件:)
  • 谢谢,运行时出现错误,找不到本地 grunt ,错误是:grunt-cli: The grunt command line interface (v1.3.2) Fatal error: Unable to find local grunt. If you're seeing this message, grunt hasn't been installed locally to your project. For more information about installing and configuring grunt, 有什么想法吗?
【解决方案2】:

我还放了以下无济于事的...

ENV PATH="$PATH:/usr/local/bin"

作为illustrated here,这应该足够了,确切的语法也是(可以肯定的)

ENV PATH="${PATH}:/usr/local/bin"

但是:

  • 确保在最后一个RUN grunt 之前添加它
  • 添加RUN ls /usr/local/bin/ 以查看您的安装命令是否有效
  • 尝试使用syntax npm instal -g grunt,而不是npm instal grunt -g

另一种方法:

Docker 镜像openjdk:8-jdk-slim 基于debian:buster-slim

所以尝试通过它的安装脚本安装node,如seen here:

# install node.js environment
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      gnupg && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
RUN curl -sL https://deb.nodesource.com/setup_${NODEJS_VERSION}.x | bash -
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      nodejs && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    npm install -g grunt

您仍然可以使用相同的基本映像 openjdk:8-jdk-slim,但您只需使用常规节点安装扩展它,而不是摆弄符号链接。

在您的情况下,请先添加ENV NODEJS_VERSION 12

【讨论】:

  • 这个 dockerfile 对你有用吗? (更新后)
  • @JhonD 你能试试其他方法吗(基于安装脚本而不是 tar 文件)?
  • 谢谢,但我还需要npm和npx,是否提供了第二种方法?
  • @JhonD npm 至少:试试看。
【解决方案3】:

这行得通

FROM openjdk:8-jdk-slim

ARG NODE_HOME=/opt/nodejs
ARG ND=v12.13.0
ENV PATH=${PATH}:${NODE_HOME}/node-${ND}-linux-x64/bin/

RUN apt-get update && \
    apt-get install --yes --no-install-recommends curl  && \
    # install node
    mkdir -p ${NODE_HOME} && \
    curl --fail --silent --output - "http://nodejs.org/dist/${ND}/node-${ND}-linux-x64.tar.gz" \
     | tar -xzv -f - -C "${NODE_HOME}" && \
    npm install -g grunt-cli

RUN grunt -v

首先,在 dockerfile 中将 NODE_HOME 上移并将其设置为构建参数。

这样我们就可以尽早设置 PATH。

通过设置节点 bin 文件夹的路径,我们可以使用该位置的所有二进制文件,而无需手动链接每个文件。这意味着安装后可以使用 grunt,而无需额外的黑魔法。

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2015-12-18
    • 2019-04-28
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多