2017-11-15 12 views
0

내가 내 고정 표시기 컨테이너를 구축 할 때 내 시도는 GPG 키를받을 실패 할 수 있다는 점에서 문제가있는 비난. 내가 제공하는 명령은 명령 행에서 실행될 때 올바르게 작동합니다.gpgp 키 요청 dockerfile에 실패하지만

  • 방화벽이 있습니다. 이에 대한 프록시 설정이 아래와 같습니다.
  • 주최자 : CentOS 7.4; 프록시는 계정이 사용 설정됩니다에 대한 고정 표시기 버전 17.09.0-CE, afdb6d4
  • 없음 환경 변수를 구축합니다.

/etc/systemd/system/docker.service.d/http-proxy.conf에서 :

#/bin/bash 
docker build -t hgk/test-container . 

:

[Service] 
Environment="HTTP_PROXY=http://<corporate proxy>/" "HTTPS_PROXY="<corporate proxy>/" "NO_PROXY=localhost,127.0.0.1,.domain.local,.corp" 

내가 이미지를 구축하기 위해 build.sh 쉘 스크립트를 사용
  • 도커 서비스는 프록시에 대한 환경 변수 according to Docker을 설정할 수있다 쉘 스크립트는 내 Dockerfile과 같은 위치에 있습니다. 이 디렉토리에있는 유일한 두 가지입니다.

    FROM openjdk:8 
    ARG KEYSERV=hkp://p80.pool.sks-keyservers.net:80 
    ARG THEPROXY=<my corporate proxy> 
    
    # grab gosu for easy step-down from root 
    # (see docker-sonarqube pull request #115) 
    RUN set -x \ 
        && wget -e https_proxy=$THEPROXY -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.10/gosu-$(dpkg --print-architecture)" \ 
        && wget -e https_proxy=$THEPROXY-O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/1.10/gosu-$(dpkg --print-architecture).asc" \ 
        && export GNUPGHOME="$(mktemp -d)" \ 
        && gpg --version \ 
        && gpg -vv --keyserver $KEYSERV --keyserver-options http-proxy=$THEPROXY --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ 
        && gpg --list-keys \ 
        && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ 
        && rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \ 
        && chmod +x /usr/local/bin/gosu \ 
        && gosu nobody true 
    

    두 wget 명령이 올바르게 작동하고 파일을 검색합니다. 밖으로 첫 번째 GPG 명령은 결국 시간 :

    + mktemp -d 
    + export GNUPGHOME=/tmp/tmp.LJ1EVFQmpO 
    + gpg --version 
    gpg (GnuPG) 2.1.18 
    libgcrypt 1.7.6-beta 
    Copyright (C) 2017 Free Software Foundation, Inc. 
    License GPLv3+: GNU GPL version 3 or later 
    <https://gnu.org/licenses/gpl.html> 
    This is free software: you are free to change and redistribute it. 
    There is NO WARRANTY, to the extent permitted by law. 
    
    Home: /tmp/tmp.LJlEVFQmpO 
    Supported algorithms: 
    Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA 
    Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, 
         CAMELLIA128, CAMELLIA192, CAMELLIA256 
    Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 
    Compression: Uncompressed, ZIP, ZLIB, BZIP2 
    + gpg -vv --keyserver hkp://p80.pool.sks-keyservers.net:80 --keyserver-options http-proxy=<corp proxy> --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 
    gpg: keybox '/tmp/tmp.LJlEVFQmpO/pubring.kbx' created 
    gpg: no running Dirmngr - starting '/usr/bin/dirmngr' 
    gpg: waiting for the dirmngr to come up ... (5s) 
    gpg: connection to the dirmngr established 
    
    [[I am hung here - It just waits for ... something? I'll update the question if anything prints after this]] 
    

    나는 우리가 과거에 거기에 도착 있는지 확인하기 위해 Dockerfile에 gpg --list-keys 명령을 넣어. 내가 명령 줄을 통해 실행할 경우, 성공적 키 검색 : 나는 SKS-keyservers 다른 시도했습니다

    [[email protected] foo]# printenv | grep proxy 
    [[email protected] foo]# gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 -- 
    keyserver-options http-proxy=<corp proxy> --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 
    gpg: keyring `/root/.gnupg/pubring.gpg' created 
    gpg: requesting key BF357DD4 from hkp server p80.pool.sks-keyservers.net 
    Version: SKS 1.1.6 
    gpg: armor header: 
    Comment: Hostname: sks.okoyono.de 
    gpg: armor header: 
    gpg: pub 4096R/BF357DD4 2014-02-28 Tianon Gravi <[email protected]> 
    gpg: key BF357DD4: removed multiple subkey binding 
    gpg: key BF357DD4: removed multiple subkey binding 
    gpg: /tmp/tmp.DIX6yQQf25/trustdb.gpg: trustdb created 
    gpg: using PGP trust model 
    gpg: key BF357DD4: public key "Tianon Gravi <[email protected]>" imported 
    gpg: 1 keys cached (126 signatures) 
    gpg: 0 keys processed (0 validity counts cleared) 
    gpg: no ultimately trusted keys found 
    gpg: Total number processed: 1 
    gpg:    imported: 1 (RSA: 1) 
    
    [[email protected] foo]# gpg --list-keys 
    /root/.gnupg/pubring.gpg 
    ------------------------ 
    pub 4096R/BF357DD4 2014-02-28 [expires: 2019-07-06] 
    uid     Tianon Gravi <[email protected]> 
    uid     Tianon Gravi <[email protected]> 
    uid     Tianon Gravi <[email protected]> 
    uid     Andrew Page (tianon) <[email protected]> 
    uid     Andrew Page (tianon) <[email protected]> 
    uid     Andrew Page (Tianon Gravi) <[email protected]> 
    uid     Tianon Gravi (Andrew Page) <[email protected]> 
    sub 4096R/769826E6 2014-02-28 [expires: 2019-07-06] 
    

    을 (우분투, MIT 및 기타 SKS) 같은 행동 - bash가 올바른, Docker의 잘못입니다.

    의견/팁/제안 사항?

    업데이트 : 내 "openjdk : 8"버전이 (8u121부터) 잠시 동안 업데이트되지 않았습니다. 나는 gpg v1.4.18을 실행하고있는 것을 발견했습니다. 나는 docker image pull openjdk:8을 수행하여 나를 8u151, gpg 2.1.18로 데려왔다. CentOS 7 머신의 gpg 버전은 2.0.22입니다. 이 문제에

  • 답변

    0

    내 솔루션 (가 바로 솔루션인지 아닌지 논쟁 상태인지)를 Dockerfile에 http_proxyhttps_proxy 환경 변수를 추가하는 것이 었습니다. 이 수정의

    FROM openjdk:8 
    ARG KEYSERV=hkp://p80.pool.sks-keyservers.net:80 
    ARG THEPROXY=<my corporate proxy> 
    ENV http_proxy $THEPROXY 
    ENV https_proxy $THEPROXY 
    
    # grab gosu for easy step-down from root 
    # (see docker-sonarqube pull request #115) 
    RUN set -x \ 
        && wget -e https_proxy=$THEPROXY -O /usr/local/bin/gosu 
    "https://github.com/tianon/gosu/releases/download/1.10/gosu-$(dpkg --print-architecture)" \ 
        && wget -e https_proxy=$THEPROXY-O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/1.10/gosu-$(dpkg --print-architecture).asc" \ 
        && export GNUPGHOME="$(mktemp -d)" \ 
        && gpg --version \ 
        && gpg -vv --keyserver $KEYSERV --keyserver-options http-proxy=$THEPROXY --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ 
        && gpg --list-keys \ 
        && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ 
        && rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \ 
        && chmod +x /usr/local/bin/gosu \ 
        && gosu nobody true 
    

    내 해석은 gpgdirmngr 회전이다. dirmngr "은 X.509 인증서의 인증서 해지 목록 (CRL)을 관리 및 다운로드하고 인증서를 다운로드하기위한 서버입니다. 이것은 어떤 형태의 네트워크 연결이 필요함을 암시합니다. [dirmngr options] [2] 페이지를 읽는 중 dirmngr의 시작 인수로 전달되지 않는 것 같은 --http-proxy 인수가 있습니다.

    어쨌든 http_proxy을 환경에 추가하면 dirmngr이 작업을 성공적으로 수행 할 수 있습니다.

    이것이 버그 인 경우 확실하지 않습니다 (--honor-http-proxy 옵션이 gnupg 소스 코드에서 기본적으로 0으로 설정되어 있으므로 http_proxy을 선택하는 이유가 확실하지 않지만 내 솔루션 이번 주말에 좀 더 자세하게 소스 코드를 읽으려고 노력할 것이지만, 더 이상 우선 순위가되지 않습니다.

    0

    시스템 파일의 환경 변수 Docker 이미지를 작성할 때 컨테이너에 전달되지 않고 대신 --build-arg 매개 변수를 사용하여 프록시 값을 전달할 수 있습니다.

    프록시 변수와 같은 런타임 옵션을 Dockerfile에 구워서는 안되며 항상 환경 변수 (또는이 빌드 인수 매개 변수)를 통해 구성을 전달하십시오.

    추가 힌트 : most applications rely on http_proxy and https_proxy - 대부분의 환경 변수는 실제로 모두 대문자이지만 프록시 변수에는 소문자 사용이보다 광범위합니다.