如何在Azure Service Fabric中为Docker容器指定命令行参数

时间:2018-10-05 14:48:48

标签: docker arguments containers azure-service-fabric

我有一个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" />)。

2 个答案:

答案 0 :(得分:1)

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

根据ServiceManifest.xml schema

  

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

模式摘录:

<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>

答案 1 :(得分:0)

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

给我带来麻烦的是正确地传递了带有其值的参数。我发现,如果存在空格,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>

为澄清起见,在我的情况下,我使用了基于Nanoserver 1803的带有容器的Windows Service Fabric。