【发布时间】:2018-04-18 00:30:33
【问题描述】:
我的 Dockerfile 中有以下命令:
RUN echo "\
export NODE_VERSION=$(\
curl -sL https://nodejs.org/dist/latest/ |\
tac |\
tac |\
grep -oPa -m 1 '(?<=node-v)(.*?)(?=-linux-x64\.tar\.xz)' |\
head -1\
)" >> /etc/bash.bashrc
RUN source /etc/bash.bashrc
以下命令应该将export NODE_VERSION=6.2.2 存储在/etc/bash.bashrc 中,但它没有存储任何内容。
但是,当我在带有 bash 的图像中并手动输入以下命令时,此方法有效。
更新:
我将 shell 从 bash 改回了 Debian/Ubuntu 默认的 dash,这是 POSIX 标准。我删除了这一行:
RUN ln -sf /bin/bash /bin/sh && ln -sf /bin/bash /bin/sh.distrib
比我尝试用export添加到环境变量:
RUN export NODE_VERSION=$(\
curl -sL https://nodejs.org/dist/latest/ |\
tac |\
tac |\
grep -oPa -m 1 '(?<=node-v)(.*?)(?=-linux-x64\.tar\.xz)' |\
head -1\
)
但同样,在创建图像时输出丢失,但在我使用$ docker run --rm -it debian /bin/sh 运行图像时有效。为什么?
更新 2:
看起来最终的解决方案应该是这样的:
RUN NODE_VERSION=$( \
curl -sL https://nodejs.org/dist/latest/ | \
tac | \
tac | \
grep -oPa -m 1 '(?<=node-v)(.*?)(?=-linux-x64\.tar\.xz)' | \
head -1 \
) && echo $NODE_VERSION
ENV NODE_VERSION $NODE_VERSION
echo $NODE_VERSION 返回 6.2.2,因为它也应该在 Dockerfile 执行时,但 ENV NODE_VERSION $NODE_VERSION 无法读取此内容。有没有办法全局定义变量或如何将RUN 的输出传递给ENV?
解决方案:
我最终将 node.js 安装部分放在相同的 RUN 命令下:
RUN NODE_VERSION=$( \
curl -sL https://nodejs.org/dist/latest/ | \
tac | \
tac | \
grep -oPa -m 1 '(?<=node-v)(.*?)(?=-linux-x64\.tar\.xz)' | \
head -1 \
) \
&& echo $NODE_VERSION \
&& curl -SLO "https://nodejs.org/dist/latest/node-v$NODE_VERSION-linux-x64.tar.xz" -o "node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/latest/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt
【问题讨论】:
-
这在 Dockerfile 中看起来很乱。为什么不把它放到一个脚本中让容器运行呢?
-
这对于以下 URL 是必需的:
https://nodejs.org/dist/latest/node-v$NODE_VERSION-linux-x64.tar.xz被解释为https://nodejs.org/dist/latest/node-v6.2.2-linux-x64.tar.xz用于 node.js 安装。不幸的是,Node.js 存储库没有提供https://nodejs.org/dist/latest/node-latest-linux-x64.tar.xz存档,这将使我的问题变得不必要。 -
我明白你为什么需要它,但你说它没有存储任何东西,这是否意味着该命令在 Dockerfile 中不起作用?如果是这样,我再次问,为什么不将该命令放在 bash 脚本中以便容器运行?
-
我试过了,输出还是空的。我正在使用
COPY ./node-version.sh /root/ RUN chmod +x $HOME/node-version.sh; /root/node-version.sh
标签: docker dockerfile