在docker-compose.yml文件中指定要用于SSL的证书?

时间:2019-08-05 16:53:03

标签: docker ssl curl docker-compose

我有一个很小的docker-compose.yaml文件,看起来像这样(它用于启动本地测试环境):

version: '2'

services:
    ubuntu:
        build:
            context: ./build
            dockerfile: ubuntu.dock
        volumes:
            - ./transfer:/home/
        ports:
            - "60000:22"
    python:
        build:
            context: ./build
            dockerfile: python.dock
        volumes:
            - .:/home/code
        links:
            - mssql
            - ubuntu
    mssql:
      image: "microsoft/mssql-server-linux"
      environment:
          SA_PASSWORD: "somepassword"
          ACCEPT_EULA: "Y"
      ports:
          - "1433:1433"

我遇到的问题是,当我运行docker-compose up时,它在此步骤(位于python.dock文件中)失败了:

Step 10/19 : RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
 ---> Running in e4963c91a05b

错误看起来像这样:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
More details here: http://curl.haxx.se/docs/sslcerts.html

python.dock文件中失败的部分看起来像这样:

# This line fails
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update -y

过去我在curl / docker上遇到过问题-因为我们使用自签名证书在防火墙级别(网络要求)进行解密/加密;我可以为容器指定一个自签名证书吗?

这将使curl伸出并下载所需的文件。

我尝试运行类似docker-compose -f docker-compose.yaml --tlscert ~/certs/the-self-signed-ca.pem up的程序,但是失败。

我该如何以编程方式进行一些操作,以便可以运行docker-compose up

1 个答案:

答案 0 :(得分:1)

如果我正确理解它,则您的防火墙会破坏TLS加密,并使用来自本地CA的证书对其进行重新加密。我认为这通常是一个糟糕的情况,您应该以端到端为目标,但政治除外。

传递给--tlscert的参数docker-compose用于与docker守护程序通信,该守护程序可能在远程运行,默认情况下在端口2376上公开。在这种情况下,您的本地docker-compose命令可在远程计算机上协调容器,包括构建映像。

对于您而言,curl命令在容器内运行。它将使用python.dock中基本映像安装的CA(通常)。要使用自定义CA,您需要

  • 将CA证书复制到映像中的正确位置,例如

    COPY the-self-signed-ca.pem /etc/ssl/certs/
    

    确切步骤取决于您的基本映像。这将使证书在容器中可用。该证书很可能会被所有后续过程使用。其他开发者/用户可能不知道已安装了自定义CA,并且连接不安全!

  • 将CA证书复制到映像中的自定义位置,例如

    COPY the-self-signed-ca.pem /some/path/the-self-signed-ca.pem 
    

    并使用--cacert参数明确告诉curl有关自定义CA的信息:

    RUN curl --cacert /some/path/the-self-signed-ca.pem https://example.com/