2017-11-08 15 views
2

이 기사에서 영감을 얻은 https://www.jfrog.com/knowledge-base/how-do-i-access-multiple-artifactory-docker-repositories-from-a-single-url/ 우리는 nginx를 리버스 프록시로 사용하여 artifactory에 여러 개의 도커 리포지토리를 구성했습니다.이미지 이름에 리포지토리 이름을 포함하여 nginx가 포함 된 Artifactory 및 다중 도커 리포지토리

접근 할 세 가지 고정 표시기 저장소가 있습니다

  • docker.acme.com (artifactoryhost/artifactory/고정 표시기/기본)
  • docker.acme.com/repository-a (artifactoryhost/artifactory/고정 표시기/저장소-A)
  • docker.acme.com/repository-b (artifactoryhost/artifactory/고정 표시기/저장소-B)

세의 repos는 권한이 자신의 사용자를 가지고있다.

끌어 오기는 괜찮지 만 사용자가 기본 저장소로 푸시 할 수 없으면 저장소 -a 또는 저장소 -b로 푸시하면 제대로 작동하지 않습니다. 푸시 중 모든 업로드는 기본 저장소에 먼저 저장되고 끝에 만 저장소 -a로 이동됩니다. 내가

docker push docker.acme.com/repository-a/myimage:1.0.0

고정 표시기 같은 것을 밀어있을 때 나는 artifactory 로그에서 볼 수 있듯이

, 일부 POST 요청을 수행 레이어를 업로드하는 패치 artifactory 업로드 위치와 진행에서 수신합니다.

2017/11/08 12:35:17 [debug] 19310#0: *6107899 http upstream request: 
"/artifactory/api/docker/repository-a/v2/myimage/blobs/uploads/? 
from=repository- 
a%2Fmyimage&mount=sha256%3A6a8bd10c9278a8e1b59bc85f634dd4045e953 
63c3b29366e9e8200ac2cd56735" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http upstream process 
header 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 malloc: 
0000000000EA8EF0:4096 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 recv: fd:23 427 of 4096 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy status 202 
"202 Accepted" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy header: 
"Server: Artifactory/5.0.1" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy header: "X- 
Artifactory-Id: 1cfb2a5a96486c54:43202ab7:15ced9e7676:-8000" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy header: 
"Docker-Distribution-Api-Version: registry/2.0" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy header: 
"Docker-Upload-Uuid: d0d4ed31-6539-43a3-bb03-35e47fa13676" 
2017/11/08 12:35:17 [debug] 19310#0: *6107899 http proxy header: 
"Location: https://docker.acme.com/v2/myimage/blobs/uploads/d0d4ed31- 
6539-43a3-bb03-35e47fa13676" 

을 따라서 다음의 모든 패치는 저장소-A에 기본 REPO에가는 것이 아니라, : 그러나 artifactory의 응답은 위치에있는 저장소 경로를 포함하지 않습니다.

답변

1

편집 :

Nginx에 어느 정도 (도 this wikipedia section 참조)에 "Internet Hosts" RFC을 적용 할 것으로 보인다, 및 400 응답 슬래시 문자로 그들에 잘못된 문자가 포함 된 호스트 헤더를 reject 것 암호. 참조한 기사는 Apache를 사용하며 Host 헤더에 비슷한 제한 사항이없는 것 같습니다. 호스트 헤더에서 저장소 이름을 분리하는 데 사용할 다른 문자를 찾아 유효하게 유지하면서이 문제를 해결할 수 있습니다. 이것은 분명히 역방향 프록시 구성에서, 특히 아래에 설명 된대로 응답 위치 헤더가 수정되는 부분에 대한 조정이 필요할 것입니다. 그러나 처음부터이 솔루션은 분명히 해킹이며 어쨌든 가장 강력한 솔루션은 아니며 Artifactory의 Docker V2 저장소를 사용하여 문서화되지 않은 API 동작을 피기 백합니다. 특히 와일드 카드 인증서를 사용할 수 없기 때문에 a flexible subdomain-based mechanism for docker repositories을 설정할 수없는 사용자에게 특히 유용합니다. 즉, 이미 그렇게하지 않았다면 적어도 문서화 된 두 가지 옵션 중 하나 인 in this page을 사용하는 것이 좋습니다.

ORIGINAL 답

그것은 그 안에 저장소 이름을 포함하지 않을 수 있습니다 원래 POST 요청의 "호스트"헤더처럼 보인다, 그렇지 않은 경우 Artifactory는 응답의 위치 헤더에 물리적 저장소의 이름을 포함했을 것이다. 귀하가 추천 한 솔루션은 Host 헤더가 $ host/$ repo 형식이어야합니다. 즉,

호스트 : 도커.acme.com/repository-a

Artifactory는이 정보를 사용하여 PATCH 엔드 포인트의 Location 헤더를 구성합니다.

좋은 요청 :

curl -XPOST -H "Host: docker.acme.com/repository-a" "http://localhost:8080/artifactory/api/docker/repository-a/v2/myimage/blobs/uploads/?from=repository-a%2Fmyimage&mount=sha256%3A6a8bd10c9278a8e1b59bc85f634dd4045e95363c3b29366e9e8200ac2cd56735" -v 

응답에서 좋은 위치 헤더 :

Location: https://docker.acme.com/repository-a/v2/myimage/blobs/uploads/fc325614-0e65-4c9a-a879-449ac9e8c66 

나쁜 요청은 다음과 같습니다

여기 컬 재생 사건
curl -XPOST -H "Host: docker.acme.com" https://... 

위치 헤더에는 Apache 서버가 차단하는 방법과 반대 순서로 "v2"및 "repoName"요소가 있습니다. 나를 위해 작동하지 않는 저장소 경로 호스트 헤더 확장,

+0

Header edit* Location "^https://<apache-server-name>/(.*?)/v2/(.*)$" "https://<apache-server-name>:<port#>/v2/$1/$2" 

HTH : artifactory의 응답을 여기에 트릭은 응답의 위치 헤더를 편집하여 아파치 설정에서 순서를 변경하는 것입니다 : ' "400 Bad Request"' – abinet

+1

@abinet은 컬 (curl) 또는 도커 (Docker)인가? 호스트 헤더가 "hostname/repoName"형식인지 확인하십시오. 계획이나 다른 것을 포함하지 마십시오. 시도해보십시오. 400으로 응답 한 요청이 artifactory request.log 파일을 사용하여 Artifactory에서 라우트되어야하는 위치로 라우트되는지 확인하십시오. 유효하다면, 유효하지 않은 호스트 헤더 또는 Apache가있을 수 있습니다. 그 자체가 400을 반환 할 수 있습니다. 티켓 @ [email protected]을 제출하고이 스레드를 참조 할 수 있도록 자유롭게 가져와주세요 .- 아파치/아티팩트 로그와 아파치 설정을 모두 포함해야합니다. –

+0

나는 컬과 도커를 모두 시험해 보았습니다. 호스트 헤더에 repo-name을 입력하자마자 "400 Bad request"가 표시됩니다. Artifactory request.log에 이에 대한 항목이 없지만 access.log에서 "내 nginx의 NA/ abinet