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