【问题标题】:Building a Docker image with a configured version of node package installed使用已安装的节点包的配置版本构建 Docker 映像
【发布时间】:2020-04-02 13:55:58
【问题描述】:

我想构建一个包含已安装节点包的 Docker 映像。如果包版本在Dockerfile中被省略或硬编码,一切正常(@14.0.0):

FROM stefanscherer/node-windows:12.16.1-nanoserver-1909
RUN npm install -g @sitecore-jss/sitecore-jss-cli@14.0.0

构建命令和结果:

docker build -t sitecore-jss-cli:14.0.0-nanoserver-1909 .

Successfully built 1c0ebbcd5be2
Successfully tagged sitecore-jss-cli:14.0.0-nanoserver-1909

但是当版本作为参数传递时(能够构建任何版本),就会发生错误。请查看更新后的Dockerfile

ARG SITECOREJSS_VERSION
FROM stefanscherer/node-windows:12.16.1-nanoserver-1909
RUN npm install -g @sitecore-jss/sitecore-jss-cli@${SITECOREJSS_VERSION}

带有参数和错误的命令:

docker build --build-arg SITECOREJSS_VERSION=14.0.0 -t sitecore-jss-cli:14.0.0-nanoserver-1909 .

...
npm ERR! code EINVALIDTAGNAME
npm ERR! Invalid tag name "${SITECOREJSS_VERSION}": Tags may not have any characters that encodeURIComponent encodes.

看起来这个参数需要以某种方式转义。任何线索如何解决这个问题?

【问题讨论】:

    标签: docker npm npm-install docker-for-windows


    【解决方案1】:

    你有两个问题:

    1. 排序

      ARG 外部 FROM 块只能在 FROM 行本身中访问。在这种情况下,由于您不需要将 --build-arg 用作 FROM 的一部分,因此将其移入:

      FROM stefanscherer/node-windows:12.16.1-nanoserver-1909
      ARG SITECOREJSS_VERSION
      ...
      

      如果您需要在 Dockerfile 中的FROM 其他地方使用它,您需要明确说明:

      ARG SITECOREJSS_VERSION
      FROM ...
      ARG SITECOREJSS_VERSION
      ...
      
    2. 插值

      根据this issue on GitHub,如果要在Windows图像中的命令中进行插值,则需要使用%

      RUN npm install -g @sitecore-jss/sitecore-jss-cli@%SITECOREJSS_VERSION%
      

    所以完整的工作版本是:

    FROM stefanscherer/node-windows:12.16.1-nanoserver-1909
    ARG SITECOREJSS_VERSION
    RUN npm install -g @sitecore-jss/sitecore-jss-cli@%SITECOREJSS_VERSION%
    

    【讨论】:

    • @SerhiiShushliapin 这很奇怪,当我运行基本的FROM node 时,将 ARG 放在(空标签)之前还是之后(标签是来自构建 arg 的值)FROM 会有所不同。但两者都没有尝试使用 "${SITECOREJSS_VERSION}" 作为文字标签名称。
    • 是的.. FROM 中的 Arg 就像一个魅力......没有问题......问题是如何正确地将它传递给 npm。
    • @SerhiiShushliapin 那么我不知道 - 我不能使用你做的实际图像,因为我在 macOS 上。使用FROM node:12.16.1-alpine,如果它在之后 FROM,则构建arg 可以工作。
    • @SerhiiShushliapin 哦,可能是因为你在 Windows 中使用了 nix 风格的插值,试试我的编辑
    • 切换到 Linux 容器,它可以工作。然后切换回 Windows 并尝试使用 '%' 的更新版本 - 也可以!谢谢@jonrsharpe!
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多