【问题标题】:How to specify commandline arguments to a docker container in Azure Service Fabric如何在 Azure Service Fabric 中为 docker 容器指定命令行参数
【发布时间】:2019-03-11 02:46:57
【问题描述】:

我有一个 docker 映像 wiremock.net-nano,它接受额外的命令行参数,例如 --Port--AdminUsername

正常的 docker 命令行如下所示:

docker run --rm -p 9091:80 sheyenrath/wiremock.net-nano --ReadStaticMappings true --AdminUsername x --AdminPassword y --RequestLogExpirationDuration 24


但是如何在 Azure Service Fabric 中配置这些参数?
ServiceManifest.xml 文件仅定义图像名称 (<ImageName>sheyenrath/wiremock.net-nano</ImageName>) 和端口转发 (<Endpoint Name="WireMock_ContainerTypeEndpoint" Port="9091" />)。

【问题讨论】:

    标签: docker arguments containers azure-service-fabric


    【解决方案1】:

    如果我没记错的话,元素中的 <ContainerHostEntryPointType>/<Commands> 就是您要查找的内容。

    根据ServiceManifest.xmlschema

    将逗号分隔的命令列表传递给容器。

    架构摘录:

    <xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/2011/01/fabric" name="ContainerHostEntryPointType">
    <xs:sequence>
      <!--container image name-->
      <xs:element name="ImageName" type="xs:string">
        <xs:annotation>
          <xs:documentation>The repo and image on https://hub.docker.com or Azure Container Registry.</xs:documentation>
        </xs:annotation>
      </xs:element>
      <!--comma delimited list of commands for container-->
      <xs:element name="Commands" type="xs:string" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Pass a comma delimited list of commands to the container.</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="EntryPoint" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="FromSource" type="xs:string" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    

    【讨论】:

    • 这确实是正确的。现在我使用了这个“--AllowPartialMapping false,--x y”但是问题是命令行参数是用单引号传递的。比如'--AllowPartialMapping false'。
    • @StefHeyenrath 你能传递需要用双引号括起来的参数命令吗?我需要传递一个命令行参数:-e "GF_SECURITY_ADMIN_PASSWORD=secret"
    • @JavaadPatel 据我了解,您正在尝试设置环境变量。如果是这种情况,那么根据this,您可以在 / 节点中设置它们。关于 标签 - 据我了解,它使用与 docker CMD 相同的语义和服务器相同的目的(但我不是 100% 确定)指令。
    • @OlegKarasik 你是对的,我误解了 Docker 的语法,“-e”就是你说的设置环境变量。我更改了我的服务清单以传递这些内容并且它现在可以工作了。
    【解决方案2】:

    正如 Oleg 正确解释的那样,您必须在 &lt;Commands&gt; 元素中的容器映像名称旁边指定 ServiceManifest.xml 中的参数。

    给我带来麻烦的是正确传递带有值的参数。我发现如果存在空格,Service Fabric 会将您的命令包含在双引号中。在这种情况下,您必须用逗号替换空格。

    例如,我有一个自定义 Dockerfile,它具有以下 exec 格式的入口点定义:

    ENTRYPOINT ["redis-server.exe", "C:\\Redis\\redis.docker.conf"]
    

    我想将 --slaveof my-redis-master-instance 6379 作为参数传递给我的 docker 容器(其中 6379 是主容器的端口)。以下服务清单会导致错误:

    <EntryPoint>
      <ContainerHost>
        <ImageName>myrepository.azurecr.io/my.servicefabric.redis:3.</ImageName>
        <Commands>--slaveof my-redis-master-instance 6379</Commands>
      </ContainerHost>
    </EntryPoint>
    

    原因是 Service Fabric 确实将命令包装到引号中,然后将其传递给 docker 映像,在该映像中它被解释为单个参数并导致错误。

    就像上面已经解释的那样,解决方案是用逗号替换空格。现在 Service Fabric 分别传递参数。

    <EntryPoint>
      <ContainerHost>
        <ImageName>myrepository.azurecr.io/my.servicefabric.redis:3.2.100</ImageName>
        <Commands>--slaveof,my-redis-master-instance,6379</Commands>
      </ContainerHost>
    </EntryPoint>
    

    为了澄清,在我的例子中,我使用 Service Fabric for Windows 和基于 Nanoserver 1803 的容器。

    【讨论】:

    • 你使用的是什么容器镜像?
    • 视窗。我对redis不熟悉,我刚刚意识到上面是在容器中运行的命令,对吧?我想将参数传递给 docker 本身以设置容器的 MAC 地址,但找不到方法。也许不可能。
    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 2019-01-25
    • 2019-03-08
    • 1970-01-01
    • 2023-01-29
    • 2021-02-27
    • 2018-09-14
    • 2017-06-09
    相关资源
    最近更新 更多