2017-02-07 4 views
0

docker 볼륨으로 작업 할 수있는 현재 API가 없으니 안타깝습니다. 현재 도커 볼륨에 데이터를 복사해야하는 경우 (NB : 도커가 아닌 컨테이너) 먼저 컨테이너가 볼륨에 액세스 할 수 있는지 확인한 다음 docker cp을 실행해야합니다. 그러나 이러한 종류의 작업을 수행하려면 볼륨이 마운트 된 도커 컨테이너가 없을 수도 있습니다. 이것은 멱등수가 아닙니다. 이렇게하면 일반적으로 유용한 API의 대부분을 사용할 수 없습니다. 이것은 많은 추가 단계를 추가하여 프로세스를 복잡하게 만듭니다. 이것은 가능한 방법이 아닙니다. 우리가 관심있는 각 볼륨에 대한 마운트 포인트를 간단히 찾을 수 있다면 호스트의 파일 시스템에 직접 대화 할 수 있다면 어떨까요?도커 볼륨 목록에 대한 볼륨 탑재 지점 찾기

그래서 우리가 사용할 일부 도커 볼륨의 이름 목록이 있다고 가정 해 봅시다. 목록의 각 항목에 대해 docker 데몬을 사용하여 검사 한 다음 해당 위치에 대한 사실을 설정하기 위해 사용할 수 있습니다.

- name: Get docker volume information 
    command: "docker volume inspect {{ item }}" 
    register: output 
    with_items: "{{ volumes }}" 

NB가 :

[ 
    { 
     "Name": "docker_sites-enabled", 
     "Driver": "local", 
     "Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data", 
     "Labels": null, 
     "Scope": "local" 
    } 
] 

플레이 북 계속 :

- name: Set volume facts 
    set_fact: 
    "{{ item.stdout|from_json|json_query('Name') }}": "{{ item.stdout|from_json|json_query('Mountpoint') }}" 
    with_items: "{{ output.results }}" 

- name: The following facts are now set 
    debug: 
    var: "{{ item }}" 
    with_items: 
    - "{{ volumes }}" 

그러나,이 내가 예상 한대로 작동하지 않는 명령이 뭔가를 반환 이것은 내가 지금까지 무엇을 가지고 그것은 가능한 한 오류보고로 "The variable name '' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores. 아마 내가 사용하고있는 JSON 쿼리 필터의 구문 때문에,하지만 난 해야하는 방법에 대한 모든 문서를 찾을 수 없습니다이 (가) 사용 중입니다.

+0

"* 이와 비슷한 *"대신 "출력"변수에 정확히 ** 표시 할 수 있습니까? 당신은'debug' 모듈을 사용하는 법을 알고 있습니다 ... – techraf

+0

또한'volumes'의 값은 무엇입니까? 그리고 어떤 과제가 실패합니까? 당신은'다음의 사실들이 지금 설정되었습니다'를 포함 시켰습니다 - 그것이 오류를내는 것이라고 가정해야합니까? 이전 질문이 실패하면 질문에 마지막 질문을 포함시키는 목적은 무엇입니까? – techraf

답변

1

왜 각 볼륨에 대한 루트 수준 변수를 생성하려고하는지 잘 모르겠습니다.

- hosts: docker_host 
    become: true 
    gather_facts: false 
    vars: 
    volumes: 
     - vol1 
     - vol2 
     - vol4 
    tasks: 
    - shell: docker volume inspect {{ volumes | join(' ') }} 
     register: vlm_res 

    - set_fact: mountpoints={{ dict(vlm_res.stdout | from_json | json_query('[].[Name,Mountpoint]')) }} 

    - debug: var=mountpoints['vol2'] 

mountpoints은 DICT, 그래서 우리는 vol2의 마운트 지점에 액세스 할 수 mountpoints['vol2']에 액세스 할 수 있습니다

이 같이 할 수 있습니다.

+0

네, 엄밀히 말하면 변수가 루트 수준 일 필요는 없습니다. 답장을 보내 주셔서 감사합니다! –