簡體   English   中英

Docker 安裝 npm 后找不到圖像錯誤 bin

[英]Docker image erorr bin not found after npm installation

我需要擴展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 ,但沒有成功。 知道如何解決嗎?

從 docker 構建的咕嚕聲 output

/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

知道缺少什么嗎?

這將起作用:

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 output:

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

咕嚕聲-v output:

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

我還放了以下無濟於事的...

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

如此處所示,這應該足夠了,確切的語法也是(可以肯定的)

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

但:

  • 確保在最后一次RUN grunt之前添加它
  • 添加RUN ls /usr/local/bin/以查看您的安裝命令是否有效
  • 嘗試使用語法npm instal -g grunt ,而不是npm instal grunt -g

另一種方法:

Docker 鏡像openjdk:8-jdk-slim基於debian:buster-slim

所以嘗試通過它的安裝腳本安裝節點,如下所示

# 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

這有效

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,而無需額外的黑魔法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM