问题描述
我对Docker并不陌生,我必须构建一个容器,该容器可以运行Python脚本,该脚本使用CSV文件的行定期将消息发送到Azure IoT中心。我已经使用Linux构建了这个容器,但是由于资源的限制,我必须使用Windows容器来重建映像。这是我尝试使用的Dockerfile的设置:
FROM mcr.microsoft.com/windows/servercore:1809
# Install pip requirements
ADD requirements.txt .
RUN python -m pip install -r requirements.txt
WORKDIR /app
ADD SimulatedDeviceFitbit.py .
WORKDIR /app
COPY sensor_original2.csv .
CMD ["python","SimulatedDeviceFitbit.py"]
使用Pip添加的唯一软件包是azure-iot-device库。 CSV用于读取将作为消息发送的数据,并且脚本处理消息的发送。每当我运行图像时,都会出现错误:
azure.iot.device.common.transport_exceptions.TlsExchangeAuthError: TlsExchangeAuthError(None) caused by SSLCertVerificationError(1,'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')
脚本中与IoT中心的连接如下:
client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
我通过Docker检查了我的网络设备,没有看到任何问题,但是显然我缺少了一些东西。我没有使用容器进行联网的经验,希望能获得任何指导。
解决方法
我相信您的容器映像缺少巴尔的摩根CA。
在使用Windows Server Core Container Image时,您可能需要启用某些WindowsFeature才能使用certutil将证书导入证书存储。
您的DockerFile应该包含以下内容:
# Copy PFX file (located on HOST on C:\test) to container and install
ADD "c:\test\BaltimoreRootCA.pfx" "c:\test\BaltimoreRootCA.pfx"
RUN certutil -importpfx "c:\test\BaltimoreRootCA.pfx"
您可以从Windows计算机导出巴尔的摩根CA或从Azure IoT SDK C Github Repo复制它
-
还请参考此仓库,其中包含有关如何启用Windows功能和导入证书的一些步骤:https://github.com/fabioharams/container
-
以及在此相关SO线程上导入证书的替代方法:Docker SSL Cert for windows