Dockerfile参数变量

Dockerfile参数变量,docker,dockerfile,Docker,Dockerfile,谢谢你的帮助 我是Docker的新手(使用17.06.2-ee-10),目前我正在Windows Server 2016上使用它,运行windowsservercore映像。我的问题很简单 在我的dockerfile中,我有 ARG destpath=C:\path\ ARG javafile=java.exe 我想做的是做另一个变量 ARG javapath=$destpath$javafile 这就是我遇到问题的地方 如果我运行echo%javapath%,它将返回$destpath$j

谢谢你的帮助

我是Docker的新手(使用17.06.2-ee-10),目前我正在Windows Server 2016上使用它,运行windowsservercore映像。我的问题很简单

在我的dockerfile中,我有

ARG destpath=C:\path\
ARG javafile=java.exe
我想做的是做另一个变量

ARG javapath=$destpath$javafile
这就是我遇到问题的地方

如果我运行echo%javapath%,它将返回$destpath$javafile(有时甚至不是这样)

它从不将添加的变量放在一起。我尝试了一些不同的方法,例如制作(ARG javapath=%destpath%%javafile%”)或尝试转义路径上的“\”字符。但什么都不管用

我是一个初学者,不确定我的问题是否需要更详细,或者dockerfile不允许我尝试做什么。如果你需要更多的澄清,请让我知道

谢谢


Arthur

在变量周围加上大括号,而不仅仅是在可能模棱两可的情况下,可以认为是良好的编程实践。所以,试试花括号。这对我有用

更新答案:

FROM centos:latest

ARG destpath=hello
ARG javafile=world
ARG javapath=${destpath}${javafile}

RUN echo $javapath
抱歉,我应该测试您提供的值。是的,为了让它工作起来,我必须用单引号将
C:\path\
括起来:

FROM centos:latest

ARG destpath='C:\path\'
ARG javafile=java.exe
ARG javapath=${destpath}${javafile}

RUN echo $javapath
结果:

$ docker build -t temp .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM centos:latest
 ---> e934aafc2206
Step 2/5 : ARG destpath='C:\path\'
 ---> Running in 61f1aa0ea477
Removing intermediate container 61f1aa0ea477
 ---> f49332bb07f9
Step 3/5 : ARG javafile=java.exe
 ---> Running in 7f965bea7edf
Removing intermediate container 7f965bea7edf
 ---> b1d66e9b07ff
Step 4/5 : ARG javapath=${destpath}${javafile}
 ---> Running in 9cfb4e2274f3
Removing intermediate container 9cfb4e2274f3
 ---> 65dc408e384b
Step 5/5 : RUN echo $javapath
 ---> Running in 7906c930caef
C:\path\java.exe ##################################### there you go
Removing intermediate container 7906c930caef
 ---> 887ef91def32
Successfully built 887ef91def32
Successfully tagged temp:latest
旧答案:

FROM centos:latest

ARG destpath=hello
ARG javafile=world
ARG javapath=${destpath}${javafile}

RUN echo $javapath
我的结果如下:

$ docker build -t temp .
Step 1/5 : FROM centos:latest
 ---> e934aafc2206
Step 2/5 : ARG destpath=hello
 ---> Running in 30f047122373
Removing intermediate container 30f047122373
 ---> 582d3a801fd0
Step 3/5 : ARG javafile=world
 ---> Running in 78817656b729
Removing intermediate container 78817656b729
 ---> a3afa410e42e
Step 4/5 : ARG javapath=${destpath}${javafile}
 ---> Running in 8baf8c862572
Removing intermediate container 8baf8c862572
 ---> 1a9c012e4d57
Step 5/5 : RUN echo $javapath
 ---> Running in 48ee08e6452d
helloworld ############################################## there it is
Removing intermediate container 48ee08e6452d
 ---> 9d72ba2aab67
Successfully built 9d72ba2aab67
Successfully tagged temp:latest

另外,如果这不起作用,那是windows的错。

谢谢您的帮助。不幸的是,当我尝试它时,它不起作用,我的echo$javapath结果是$javapath,echo%javapath%结果是${destpath}${javafile}。似乎是windows的问题,我还没有在线看到解决方案/示例。windows不是最好的使用工具。。。当你做编程的时候。。。