如何在 Azure Service Fabric 中为 docker 容器指定命令行参数
How to specify commandline arguments to a docker container in 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" />
)。
如果我没记错的话,元素中的 <ContainerHostEntryPointType>/<Commands>
就是您要查找的内容。
根据ServiceManifest.xml
schema:
Pass a comma delimited list of commands to the container.
架构摘录:
<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>
正如 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>
为了澄清,在我的例子中,我使用 Service Fabric for Windows 和基于 Nanoserver 1803 的容器。
我有一个 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" />
)。
如果我没记错的话,元素中的 <ContainerHostEntryPointType>/<Commands>
就是您要查找的内容。
根据ServiceManifest.xml
schema:
Pass a comma delimited list of commands to the container.
架构摘录:
<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>
正如 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>
为了澄清,在我的例子中,我使用 Service Fabric for Windows 和基于 Nanoserver 1803 的容器。