代码之家  ›  专栏  ›  技术社区  ›  Mike Christensen

在RUN语句中使用dockerfile参数

  •  6
  • Mike Christensen  · 技术社区  · 8 年前

    我有以下Dockerfile,它可以工作:

    FROM someimage
    ARG transform
    
    COPY Web*.config /inetpub/wwwroot/
    RUN powershell /Build/Transform.ps1 -xml "/inetpub/wwwroot/web.config" -xdt "/inetpub/wwwroot/web.debug.config"
    

    web.debug.config 文件生成时传入的参数。所以我把最后一行改成:

    RUN powershell /Build/Transform.ps1 -xml "/inetpub/wwwroot/web.config" -xdt "/inetpub/wwwroot/${transform}"
    

    当我这么做的时候 ${transform} 参数不会被插值,而是被转换为空字符串。我已经确认 transform 参数被正确传递,因为我可以:

    COPY ${transform} /inetpub/wwwroot/
    

    ...文件会被复制。是否有其他方法可以使用RUN命令在字符串中插入参数?

    我在Windows 10上使用Docker 18.03.1-ce。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Mike Christensen    8 年前

    嗯,我找到了一个可行的解决方案,但肯定不理想。看起来变量并没有在RUN语句中展开(至少在Windows上,还没有尝试过Linux)。然而,COPY语句将扩展它们。因此,我可以用硬编码的名称将我的文件复制到临时文件中,然后使用:

    COPY ./ /inetpub/wwwroot/
    COPY ${transform} /inetpub/wwwroot/Web.Current.config
    RUN powershell -executionpolicy bypass /Build/Transform.ps1 -xml "/inetpub/wwwroot/web.config" -xdt "/inetpub/wwwroot/Web.Current.config"
    

    在这种特殊的情况下,它对我很有效。

    更新:找到了另一种有效的方法

    这可能是使用环境变量的更好方法:

    FROM someimage
    ARG transform
    ENV TransformFile ${transform}
    
    COPY ./ /inetpub/wwwroot/
    RUN powershell -executionpolicy bypass /Build/Transform.ps1 -xml "/inetpub/wwwroot/web.config" -xdt "/inetpub/wwwroot/$ENV:TransformFile"
    

    在这种情况下,Docker将计算参数 transform 并将其设置为环境变量 TransformFile .当我在PowerShell脚本中使用它时,评估参数的不再是Docker,而是PowerShell本身。因此,必须使用用于插值环境变量的Powershell语法。

        2
  •  0
  •   VonC    8 年前

    这个 shell form of Dockerfile RUN 应该允许arg扩展。

    检查引号是否与

    RUN powershell ... -xdt "/inetpub/wwwroot/"${transform}
    

    注意:您可以在 Microsoft documentation powershell命令使用 $var 而不是 ${var}

        3
  •  0
  •   mahes wari    8 年前

    试试这个dockerfile

    FROM someimage
    ENV trans transform
    
    COPY ${trans}/inetpub/wwwroot/
    RUN powershell /Build/Transform.ps1 -xml "/inetpub/wwwroot/web.config" -xdt "/inetpub/wwwroot/${trans}"
    

    运行命令

    docker build --build-arg transform="web.debug.config" -t sample:latest .