web-dev-qa-db-fra.com

Le conteneur Docker ne peut pas curl, le numéro de version SSL est incorrect

Je développe derrière un proxy d'entreprise, en utilisant Linux Mint Sylvia (Docker a été installé via la source Ubuntu 16.04.3 Xenial).

$ docker -v
Docker version 17.12.1-ce, build 7390fc6

J'ai suivi ces étapes pour télécharger des images via le docker pull. 

Mon http-proxy.conf:

$ cat /etc/systemd/system/docker.service.d/http-proxy.conf 
[Service]
Environment="HTTP_PROXY=http://my_user:my_pass@company_proxy:3128/"
Environment="HTTPS_PROXY=https://my_user:my_pass@company_proxy:3128/"
Environment="NO_PROXY=localhost,127.0.0.0/8"

Mon /etc/default/docker:

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
export http_proxy="http://my_user:my_pass@company_proxy:3128"
export https_proxy="https://my_user:my_pass@company_proxy:3128"
export HTTP_PROXY="http://my_user:my_pass@company_proxy:3128"
export HTTPS_PROXY="https://my_user:my_pass@company_proxy:3128"

Je dois exécuter curl dans un conteneur Alpine à plusieurs étages. Pour des raisons de simplicité, j'ai construit cette image simple, qui ressemble à ce que j'essaie d'accomplir et comporte la même erreur.

FROM Alpine:3.7

ENV HTTP_PROXY http://my_user:my_pass@company_proxy:3128
ENV HTTPS_PROXY https://my_user:my_pass@company_proxy:3128

RUN apk add --no-cache curl

CMD ["curl","-v","--tlsv1","https://www.docker.io/"]

Construit avec

$ docker build --network Host --rm -t test/Alpine:curl .

Courir sans --network Host.

$ docker run --rm test/Alpine:curl                      
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Could not resolve proxy: company_proxy
* Closing connection 0
curl: (5) Could not resolve proxy: company_proxy

Courir avec --network Host.

$ docker run --network Host --rm test/Alpine:curl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 10.2.255.0...
* TCP_NODELAY set
* Connected to company_proxy (10.2.255.0) port 3128 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [233 bytes data]
* error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Closing connection 0
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

Je suis un débutant avec Docker et j'ai testé cette image sur 2 réseaux wifi (tous deux sans proxy), les conteneurs fonctionnaient bien. Des indices sur ce qui pourrait causer cette erreur SSL?


Edit: C’est mon problème initial, j’ai une image de menu fixe à plusieurs étapes qui exécute le code pour enrouler quelque chose à partir de firebase.

// main.go
package main

import (
    "os/exec"
    "os"
    "log"
)

func main() {
    c := exec.Command("curl","--tlsv1","-kv","-X","PATCH","-d",`{"something" : "something"}`, `https://<firebase-link>`);

    c.Stdout = os.Stdout
    c.Stderr = os.Stderr
    err := c.Run()
    checkerr(err)
}


func checkerr(err error) {
    if err != nil{
        log.Fatal(err.Error())
        panic(err)
    }
}

Le fichier Docker d'origine:

# This image only builds the go binaries
FROM golang:1.10-Alpine as goalpine-image

ENV HTTP_PROXY http://my_user:my_pass@company_proxy:3128
ENV HTTPS_PROXY https://my_user:my_pass@company_proxy:3128
ENV FULL_PATH /go/src/<project-name>

WORKDIR $FULL_PATH

# Add the source code:

ADD . $FULL_PATH

# Build it:
RUN cd $FULL_PATH \
    && CGO_ENABLED=0 GOOS=linux GOARCH=AMD64 go build -o bin/<project-name>

# This image holds the binaries from the previous

FROM Alpine

RUN apk add --no-cache bash curl\
    && mkdir build

ENV Word_DIR=/build

WORKDIR WORK_DIR

COPY --from=goalpine-image /go/src/<project-name>/bin ./

CMD ["./<project-name>"]
6
Aristu

J'ai modifié ma question pour qu'elle contienne plus d'informations sur mon problème initial. Curieusement, le problème persiste dans l'image du jouet. Donc, si quelqu'un a encore ce problème, c'est ce qui est résolu pour moi. 

Le fichier Dockerfile multi-étapes. Il semble que les deux étapes doivent avoir accès aux envs du proxy.

# This image only builds the go binaries
FROM golang:1.10-Alpine as goalpine-image

ARG http_proxy
ARG https_proxy

ENV HTTP_PROXY $http_proxy
ENV HTTPS_PROXY $https_proxy

# Build envs
ENV FULL_PATH /go/src/<project-name>

WORKDIR $FULL_PATH

# Add the source code:

ADD . $FULL_PATH

# Build it:
RUN cd $FULL_PATH \
    && apk update \
    && apk add --no-cache curl \
    && CGO_ENABLED=0 GOOS=linux GOARCH=AMD64 go build -o bin/<project-name>

# This image holds the binaries from the previous

FROM Alpine:3.7

ENV HTTP_PROXY $http_proxy
ENV HTTPS_PROXY $https_proxy

RUN apk update \
    && apk add --no-cache bash curl\
    && mkdir build

ENV Word_DIR=/build

WORKDIR WORK_DIR

COPY --from=goalpine-image /go/src/<project-name>/bin ./

CMD ["./<project-name>"]

Bâtiment:

Assurez-vous de définir http_proxy et https_proxy en tant qu’environnement les variables, les miennes sont en /etc/profile.

docker build --rm --build-arg http_proxy=$http_proxy --build-arg https_proxy=$https_proxy --network Host -t <project-name>:multi-stage .

Fonctionnement:

docker container run --rm --network Host <project-name>:multi-stage
1
Aristu