首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使npm安装的应用程序出现在最终Docker映像中

无法使npm安装的应用程序出现在最终Docker映像中
EN

Stack Overflow用户
提问于 2019-05-15 05:20:20
回答 2查看 202关注 0票数 1

我已经将Vega工具的安装添加到docker-asciidoctor Dockerfile中,它们在运行bats测试时存在,但当我运行镜像时,它们不再存在。

我对Docker是个新手。

我还尝试了将目录node_modules添加到路径的一些变体,但都不起作用。

在所有情况下,Vega工具的安装目录都不在映像中。

我像这样添加Vega工具:

代码语言:javascript
复制
...
  && npm install --build-from-source -g vega-cli vega vega-lite vega-embed \
  && echo `which vl2vg` \
...

它提供以下输出:

代码语言:javascript
复制
...
/usr/bin/vl2png -> /usr/lib/node_modules/vega-lite/bin/vl2png
/usr/bin/vl2svg -> /usr/lib/node_modules/vega-lite/bin/vl2svg
/usr/bin/vl2vg -> /usr/lib/node_modules/vega-lite/bin/vl2vg
/usr/bin/vg2pdf -> /usr/lib/node_modules/vega-cli/bin/vg2pdf
/usr/bin/vg2png -> /usr/lib/node_modules/vega-cli/bin/vg2png
/usr/bin/vg2svg -> /usr/lib/node_modules/vega-cli/bin/vg2svg
...
/usr/bin/vl2vg

正如人们所料。

其中一个工具的测试如下所示:

代码语言:javascript
复制
@test "vl2vg is installed and in the path" {
  docker run -t --rm "${DOCKER_IMAGE_NAME_TO_TEST}" which vl2vg
}

那就过去了。

当我执行以下操作时,我希望Vega工具在映像中可用:

代码语言:javascript
复制
docker run -it --entrypoint /bin/sh asciidoctor/docker-asciidoctor
/documents # which vl2vg
which: no vl2vg in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

根据构建映像的输出,我本应看到/usr/bin/vl2vg,但/usr/lib/node_modules不在那里。

为了完整起见,这里是Docker文件和采取的步骤:

代码语言:javascript
复制
FROM alpine:3.9

LABEL MAINTAINERS="Guillaume Scheibel <guillaume.scheibel@gmail.com>, Damien DUPORTAL <damien.duportal@gmail.com>"

ARG asciidoctor_version=2.0.9
ARG asciidoctor_confluence_version=0.0.2
ARG asciidoctor_pdf_version=1.5.0.alpha.17
ARG asciidoctor_diagram_version=1.5.16
ARG asciidoctor_epub3_version=1.5.0.alpha.9
ARG asciidoctor_mathematical_version=0.3.0
ARG asciidoctor_revealjs_version=2.0.0

ENV ASCIIDOCTOR_VERSION=${asciidoctor_version} \
  ASCIIDOCTOR_CONFLUENCE_VERSION=${asciidoctor_confluence_version} \
  ASCIIDOCTOR_PDF_VERSION=${asciidoctor_pdf_version} \
  ASCIIDOCTOR_DIAGRAM_VERSION=${asciidoctor_diagram_version} \
  ASCIIDOCTOR_EPUB3_VERSION=${asciidoctor_epub3_version} \
  ASCIIDOCTOR_MATHEMATICAL_VERSION=${asciidoctor_mathematical_version} \
  ASCIIDOCTOR_REVEALJS_VERSION=${asciidoctor_revealjs_version}

# Installing package required for the runtime of
# any of the asciidoctor-* functionnalities
RUN apk add --no-cache \
    bash \
    curl \
    ca-certificates \
    findutils \
    font-bakoma-ttf \
    graphviz \
    inotify-tools \
    make \
    openjdk8-jre \
    py2-pillow \
    py-setuptools \
    python2 \
    ruby \
    ruby-mathematical \
    ttf-liberation \
    unzip \
    which

RUN addgroup --system appgroup && adduser -S appuser -G appgroup

WORKDIR /data/



# Installing Ruby Gems needed in the image
# including asciidoctor itself
RUN apk add --no-cache --virtual .rubymakedepends \
    build-base \
    libxml2-dev \
    ruby-dev \
  && gem install --no-document \
    "asciidoctor:${ASCIIDOCTOR_VERSION}" \
    "asciidoctor-confluence:${ASCIIDOCTOR_CONFLUENCE_VERSION}" \
    "asciidoctor-diagram:${ASCIIDOCTOR_DIAGRAM_VERSION}" \
    "asciidoctor-epub3:${ASCIIDOCTOR_EPUB3_VERSION}" \
    "asciidoctor-mathematical:${ASCIIDOCTOR_MATHEMATICAL_VERSION}" \
    asciimath \
    "asciidoctor-pdf:${ASCIIDOCTOR_PDF_VERSION}" \
    "asciidoctor-revealjs:${ASCIIDOCTOR_REVEALJS_VERSION}" \
    coderay \
    epubcheck:3.0.1 \
    haml \
    kindlegen:3.0.3 \
    pygments.rb \
    rake \
    rouge \
    slim \
    thread_safe \
    tilt \
  && apk add --update npm \
#  && npm -g config set user root \
  && apk --no-cache --virtual .canvas-build-deps add \
        build-base \
        cairo-dev \
        jpeg-dev \
        pango-dev \
        giflib-dev \
        pixman-dev \
        pangomm-dev \
        libjpeg-turbo-dev \
        freetype-dev \
    && apk --no-cache add \
        pixman \
        cairo \
        pango \
        giflib \
#  && npm -g config set user root \
  && npm config set user 0 \
  && npm config set unsafe-perm true \
  && npm install --build-from-source -g vega-cli vega vega-lite vega-embed \
  && echo `which vl2vg` \
#    && apk del .canvas-build-deps \
  && apk del -r --no-cache .rubymakedepends

ENV PATH /data/node_modules/.bin:$PATH
ENV NODE_PATH /data/node_modules/

# Installing Python dependencies for additional
# functionnalities as diagrams or syntax highligthing
RUN apk add --no-cache --virtual .pythonmakedepends \
    build-base \
    python2-dev \
    py2-pip \
  && pip install --upgrade pip \
  && pip install --no-cache-dir \
    actdiag \
    'blockdiag[pdf]' \
    nwdiag \
    Pygments \
    seqdiag \
  && apk del -r --no-cache .pythonmakedepends

USER appuser

WORKDIR /documents
VOLUME /documents

CMD ["/bin/bash"]

build命令是(从Makefile中提取的):

代码语言:javascript
复制
DOCKER_IMAGE_NAME ?= docker-asciidoctor
DOCKERHUB_USERNAME ?= asciidoctor
DOCKER_IMAGE_TEST_TAG ?= $(shell git rev-parse --short HEAD)
build:
    docker build \
        -t $(DOCKER_IMAGE_NAME_TO_TEST) \
        -f Dockerfile \
        $(CURDIR)/

测试使用的是:

代码语言:javascript
复制
test:
    bats $(CURDIR)/tests/*.bats

其中一个测试就是上面提到的那个。

EN

回答 2

Stack Overflow用户

发布于 2019-05-15 16:57:26

出现这种情况的根本原因是我没有使用刚刚构建的映像,因为我没有标记该映像。

代码语言:javascript
复制
docker tag asciidoctor/docker-asciidoctor:442d4d0 asciidoctor/docker-asciidoctor:latest

然后事情就好办了。

票数 0
EN

Stack Overflow用户

发布于 2020-04-15 00:44:53

非常有帮助,特别是关于npm install -g canvas和vega-cli使用npm - g config set user root的技巧。

我是从一个不同的基础镜像构建的:mhart/alpine node。这是为我工作的Dockerfile。

代码语言:javascript
复制
FROM mhart/alpine-node:12.16.2

WORKDIR /app

COPY *.jar .

RUN apk add --no-cache \
    python2 \
    build-base \
    g++ \
    cairo-dev \
    jpeg-dev \
    pango-dev \
    bash \
    imagemagick

RUN npm -g config set user root \
 && npm install -g canvas \
 && npm install -g vega vega-lite vega-cli

# USER root
# RUN apk update
# RUN apk fetch openjdk8
# RUN apk add openjdk8

中注释掉的四行也是用于安装java的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56138776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档