ENV / ARG命令未在Dockerfile中填充变量

时间:2018-08-31 19:22:22

标签: docker dockerfile

我正在尝试创建一个带有nodejs基本映像的nanoserver,但似乎无法使ARG(或ENV)命令正常工作。

我的docker文件:

#define ENUM(T1, T2) \
enum class T1 : T2; \
inline T1 operator~ (T1 a) { return (T1)~(int)a; } \
inline T1 operator| (T1 a, T1 b) { return static_cast<T1>((static_cast<T2>(a) | static_cast<T2>(b))); } \
inline T1 operator& (T1 a, T1 b) { return static_cast<T1>((static_cast<T2>(a) & static_cast<T2>(b))); } \
inline T1 operator^ (T1 a, T1 b) { return static_cast<T1>((static_cast<T2>(a) ^ static_cast<T2>(b))); } \
inline T1& operator|= (T1& a, T1 b) { return reinterpret_cast<T1&>((reinterpret_cast<T2&>(a) |= static_cast<T2>(b))); } \
inline T1& operator&= (T1& a, T1 b) { return reinterpret_cast<T1&>((reinterpret_cast<T2&>(a) &= static_cast<T2>(b))); } \
inline T1& operator^= (T1& a, T1 b) { return reinterpret_cast<T1&>((reinterpret_cast<T2&>(a) ^= static_cast<T2>(b))); } \
enum class T1 : T2

ENUM(Options, short) {
    FIRST  = 1 << 0,
    SECOND = 1 << 1,
    THIRD  = 1 << 2,
    FOURTH = 1 << 3
};

auto options = Options::FIRST | Options::SECOND;
options |= Options::THIRD;
if ((options & Options::SECOND) == Options::SECOND)
    cout << "Contains second option." << endl;
if ((options & Options::THIRD) == Options::THIRD)
    cout << "Contains third option." << endl;
return 0;

// Output:
// Contains second option. 
// Contains third option.

构建命令:

FROM microsoft/nanoserver

ENV NODE_VERSION=8.11.4

ADD https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-win-x64.zip C:\\build\\node-v${NODE_VERSION}-win-x64.zip


RUN powershell -Command Expand-Archive C:\build\node-v${NODE_VERSION}-win-x64.zip C:\; Rename-Item C:\node-v${NODE_VERSION}-win-x64 node
RUN SETX PATH C:\node

ENTRYPOINT C:\node\node.exe

它会下载zip文件,但是当它尝试重命名下载的文件时会引发错误:

docker build . -t base-image:latest

2 个答案:

答案 0 :(得分:1)

根据ENV documentation

  

以下变量列表支持环境变量   Dockerfile中的说明:

     

标签停止信号用户量工作簿中的添加副本环境   为:

     

ONBUILD(与上面支持的说明之一结合使用时)

因此,ENV指令不支持使用RUN定义的变量。

但是,您可以将ENV指令替换为ARG指令,并且NODE_VERSION将在后续的RUN指令中提供。

示例:

FROM microsoft/nanoserver

ARG NODE_VERSION=8.11.4

ADD https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-win-x64.zip C:\\build\\node-v${NODE_VERSION}-win-x64.zip


RUN powershell -Command Expand-Archive C:\build\node-v${NODE_VERSION}-win-x64.zip C:\; Rename-Item C:\node-v${NODE_VERSION}-win-x64 node
RUN SETX PATH C:\node

ENTRYPOINT C:\node\node.exe

此外,您可以在NODE_VERSION命令中覆盖docker build的值。

$ docker build -t base-image:latest --build-arg NODE_VERSION=10.0.0 .

使用ARG指令将不会使NODE_VERSION在正在运行的容器环境中可用。根据您的用例,您可能还需要使用其他ENV定义。

答案 1 :(得分:0)

在这里找到答案

https://github.com/docker/for-win/issues/542

本质上-在powershell命令中,必须使用%VARIABLE_NAME%格式:

FROM microsoft/nanoserver

ENV NODE_VERSION=8.11.4

ADD https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-win-x64.zip C:\\build\\node-v${NODE_VERSION}-win-x64.zip


RUN powershell -Command Expand-Archive C:\build\node-v%NODE_VERSION%-win-x64.zip C:\; Rename-Item C:\node-v%NODE_VERSION%-win-x64 node
RUN SETX PATH C:\node

ENTRYPOINT C:\node\node.exe