Docker 컨테이너의 호스트에서 쉘 스크립트를 실행하는 방법은 무엇입니까?


94

Docker 컨테이너에서 호스트를 제어하는 ​​방법은 무엇입니까?

예를 들어, 호스트 bash 스크립트에 복사를 실행하는 방법은 무엇입니까?


8
도커에서 호스트를 분리하는 것과 정확히 반대가 아닐까요?
Marcus Müller

31
예. 그러나 때로는 필요합니다.
Alex Ushakov


"컨트롤 호스트"에 대해 잘 모르겠지만 최근에 Docker를 사용하여 스크립트를 실행하여 거대한 워크로드를 처리하고 (AWS 탑재 GPU 사용) 그 결과를 호스트에 출력하는 데이터 과학자의 이야기를 들었습니다. 매우 흥미로운 사용 사례입니다. 기본적으로 docker 덕분에 안정적인 실행 환경으로 패키지 된 스크립트
KCD

@KCD 그리고 왜 LXC (시스템 수준 컨테이너)를 사용하는 대신 도커를 통한 앱 컨테이너화를 선호합니까?
Alex Ushakov

답변:


28

그것은 정말로 bash 스크립트가 필요한 것에 달려 있습니다!

예를 들어 bash 스크립트가 일부 출력 만 에코하면 다음을 수행 할 수 있습니다.

docker run --rm -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh

또 다른 가능성은 bash 스크립트가 일부 소프트웨어를 설치하도록하는 것입니다 (예 : docker-compose를 설치하는 스크립트). 당신은 다음과 같은 것을 할 수 있습니다

docker run --rm -v /usr/bin:/usr/bin --privileged -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh

그러나이 시점에서 컨테이너 내부에서 호스트에 필요한 특정 권한을 허용하기 위해 스크립트가 수행하는 작업을 자세히 알아야합니다.


1
호스트에 연결하고 새 컨테이너를 만드는 컨테이너를 만드는 아이디어가있었습니다.
Alex Ushakov

1
Docker는 상대 마운트를 좋아하지 않는 것 같습니다. 이 작업을해야합니다docker run --rm -v $(pwd)/mybashscript.sh:/work/mybashscript.sh ubuntu /work/mybashscript.sh
KCD

5
첫 번째 줄은 새 우분투 컨테이너를 시작하고 읽을 수있는 곳에 스크립트를 마운트합니다. 예를 들어 컨테이너가 호스트 파일 시스템에 액세스하는 것을 허용하지 않습니다. 두 번째 줄은 호스트 /usr/bin를 컨테이너에 노출합니다 . 두 경우 모두 컨테이너에는 호스트 시스템에 대한 전체 액세스 권한이 없습니다. 내가 틀렸을 수도 있지만 나쁜 질문에 대한 잘못된 대답 인 것 같습니다.
Paul

3
충분히 공평했다. 질문은 꽤 모호했다. 질문은 "호스트 시스템에 대한 전체 액세스"를 요구하지 않았습니다. 설명했듯이 bash 스크립트가 일부 출력 만 표시하도록 의도 된 경우 호스트 파일 시스템에 대한 액세스가 필요하지 않습니다. docker-compose를 설치하는 두 번째 예제의 경우 필요한 유일한 권한은 바이너리가 저장되는 bin 디렉토리에 대한 액세스입니다. 내가 처음에 말했듯이이 작업을 수행하려면 올바른 권한을 허용하기 위해 스크립트가 수행하는 작업에 대한 매우 구체적인 아이디어가 있어야합니다.
Paul Becotte

1
이 스크립트는 호스트가 아닌 컨테이너에서 실행됩니다
All2Pie

60

내가 사용하는 해결책은 호스트에 연결하고 다음 SSH과 같은 명령을 실행하는 것입니다.

ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"

최신 정보

이 답변이 계속 투표를 받기 때문에 스크립트를 호출하는 데 사용되는 계정은 권한이 전혀없는 계정이어야하지만 해당 스크립트를 다음과 같이 실행해야한다는 점을 상기시키고 싶습니다 sudo. sudoers파일 에서 완료 ).


또 다른 해결 방법으로 컨테이너는 일련의 명령을 출력 할 수 있으며 호스트는 컨테이너가 종료 된 후 명령을 실행할 수 있습니다. eval $ (docker run --rm -it container_name_to_output script)
parity3

Docker 컨테이너 내부에서 호스트의 명령 줄을 실행해야하는데 컨테이너로 이동할 때 ssh찾을 수 없습니다. 다른 제안이 있습니까?
Ron Rosenfeld

@RonRosenfeld, 어떤 Docker 이미지를 사용하고 있습니까? debian / ubuntu의 경우 다음을 실행합니다 apt update && apt install openssh-client..
Mohammed Noureldin

내 Synology NAS에 설치된 모든 것입니다. 어떻게 알 수 있습니까?
Ron Rosenfeld

@RonRosenfeld은, 미안 해요 당신이 무슨 뜻인지 이해가 안 돼요
모하메드 Noureldin에게

52

명명 된 파이프를 사용했습니다. 호스트 os에서 명령을 반복하고 읽는 스크립트를 만든 다음 eval을 호출합니다.

Docker 컨테이너가 명명 된 파이프를 읽도록합니다.

파이프에 액세스하려면 볼륨을 통해 마운트해야합니다.

이것은 SSH 메커니즘 (또는 유사한 소켓 기반 방법)과 유사하지만 호스트 장치로 적절하게 제한하므로 아마도 더 좋을 것입니다. 또한 인증 정보를 전달할 필요가 없습니다.

나의 유일한 경고는 당신이 이것을하는 이유에 대해 조심하라는 것입니다. 사용자 입력 등으로 자체 업그레이드하는 방법을 만들고 싶다면 완전히해야 할 일이지만, 적절한 방법은 args로 전달하는 것이기 때문에 일부 구성 데이터를 가져 오는 명령을 호출하고 싶지 않을 것입니다. / 볼륨을 도커에 넣습니다. 또한 회피하고 있다는 사실에주의해야하므로 허가 모델에 대해 생각해보십시오.

볼륨에서 스크립트를 실행하는 것과 같은 다른 답변 중 일부는 전체 시스템 리소스에 액세스 할 수 없기 때문에 일반적으로 작동하지 않지만 사용량에 따라 더 적절할 수 있습니다.


14
주의 : 이것은 정답 / 최상의 답변이며 조금 더 칭찬이 필요합니다. 다른 모든 대답은 "당신이하려는 일"을 묻고 물건에 대한 예외를 만드는 것입니다. 나는 이것을 할 수 있도록 요구하는 매우 구체적인 사용 사례가 있으며 이것이 유일한 좋은 대답 imho입니다. 위의 SSH는 보안 / 방화벽 표준을 낮추어야하며 도커 실행 항목은 잘못되었습니다. 감사합니다. 나는 이것이 간단한 복사 / 붙여 넣기 답변이 아니기 때문에 많은 찬성 투표를받지 않는다고 가정하지만 이것이 답입니다. 내가 할 수 있다면 나에게서 +100 포인트
Farley

3
더 많은 정보를 원하는 사람들은 호스트 컴퓨터에서 실행되는 다음 스크립트를 사용할 수 있습니다. unix.stackexchange.com/a/369465 물론, 'nohup'으로 실행하고 일종의 감독자 래퍼를 만들어야합니다. 살아있는 상태로 유지하기 위해 (크론 작업을 사용할 수도 있습니다 : P)
sucotronic

7
이것은 좋은 대답이 될 수 있습니다. 그러나 더 자세한 정보와 명령 줄 설명을 더 제공하면 훨씬 나을 것입니다. 자세히 설명 할 수 있습니까?
Mohammed Noureldin

5
찬성, 작동합니다! 볼륨이 마운트 된 'mkfifo host_executor_queue'를 사용하여 명명 된 파이프를 만듭니다. 그런 다음 호스트의 셸로 대기열에 넣은 명령을 실행하는 소비자를 추가하려면 'tail -f host_executor_queue | sh & '. 끝에있는 &는 백그라운드에서 실행되도록합니다. 마지막으로 명령을 큐에 푸시하려면 'echo touch foo> host_executor_queue'를 사용합니다.이 테스트는 홈 디렉토리에 임시 파일 foo를 만듭니다. 소비자가 시스템 시작시 시작되도록하려면 '@reboot tail -f host_executor_queue | crontab의 sh & '. host_executor_queue에 상대 경로를 추가하기 만하면됩니다.
skybunk

1
누군가 예제 코드로 답변을 편집 할 수 있습니까?
Lucas Pottersky

6

보안에 대해 걱정하지 않고 단순히 OP와 같은 다른 도커 컨테이너 내에서 호스트에서 도커 컨테이너를 시작하려는 경우 청취 소켓을 공유하여 호스트에서 실행중인 도커 컨테이너를 도커 컨테이너와 공유 할 수 있습니다.

https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface를 참조 하십시오. 귀하의 개인 위험 허용이 특정 응용 프로그램이 허용하는 경우를 참조하십시오.

시작 명령에 다음 볼륨 인수를 추가하여이를 수행 할 수 있습니다.

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

또는 도커 내에서 /var/run/docker.sock을 공유하여 다음과 같이 파일을 작성합니다.

version: '3'

services:
   ci:
      command: ...
      image: ...
      volumes
         - /var/run/docker.sock:/var/run/docker.sock

Docker 컨테이너 내에서 docker start 명령을 실행하면 호스트에서 실행중인 Docker 서버가 요청을보고 형제 컨테이너를 프로비저닝합니다.

크레딧 : http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/


1
Docker는 컨테이너에 설치되어야하며 그렇지 않으면 Docker 바이너리 (예 :)에 대한 볼륨도 마운트해야합니다 /usr/bin/docker:/usr/bin/docker.
Gerry

1
컨테이너에 도커 소켓을 장착 할 때주의하십시오. 심각한 보안 문제가 될 수 있습니다. docs.docker.com/engine/security/security/…
DatGuyKaj

@DatGuyKaj 감사합니다. 귀하의 리소스에 설명 된 문제를 반영하도록 내 답변을 수정했습니다.
Matt Bucci

이없는 용기에, 호스트에서 스크립트를 실행에 관한 질문에 응답하지 않습니다
브랜든

5

이 답변은 Bradford Medeiros 솔루션의 더 자세한 버전 일 뿐이며 저에게도 가장 좋은 답변으로 판명되었으므로 그에게 신용이 돌아갑니다.

그의 대답에서 그는 무엇을해야하는지 ( 파이프 명명 ) 설명하지만 정확히 어떻게해야하는지 설명하지 않습니다.

나는 그의 해결책을 읽을 당시에 명명 된 파이프가 무엇인지 몰랐다는 것을 인정해야한다. 그래서 구현하는 데 어려움을 겪었지만 (실제로는 정말 간단하지만) 성공 했으므로 어떻게했는지 설명함으로써 기꺼이 도와 드리겠습니다. 그래서 내 대답의 요점은 작동하기 위해 실행해야 할 명령을 자세히 설명하는 것입니다.

1 부-Docker없이 명명 된 파이프 개념 테스트

기본 호스트에서 명명 된 파이프 파일을 저장할 폴더 (예 /path/to/pipe/: 파이프 이름)를 mypipe선택한 후 다음을 실행합니다.

mkfifo /path/to/pipe/mypipe

파이프가 생성됩니다. 유형

ls -l /path/to/pipe/mypipe 

그리고 액세스 권한이 "p"로 시작하는지 확인하십시오.

prw-r--r-- 1 root root 0 mypipe

이제 실행 :

tail -f /path/to/pipe/mypipe

터미널은 이제 데이터가이 파이프로 전송되기를 기다리고 있습니다.

이제 다른 터미널 창을 엽니 다.

그리고 실행 :

echo "hello world" > /path/to/pipe/mypipe

첫 번째 터미널 (가있는 터미널)을 확인하면 tail -f"hello world"가 표시되어야합니다.

2 부-파이프를 통해 명령 실행

호스트 컨테이너에서 tail -f입력으로 전송 된 내용 만 출력 하는 실행 대신 명령으로 실행하는 다음 명령을 실행합니다.

eval "$(cat /path/to/pipe/mypipe)"

그런 다음 다른 터미널에서 다음을 실행 해보십시오.

echo "ls -l" > /path/to/pipe/mypipe

첫 번째 터미널로 돌아 가면 결과가 표시됩니다. ls -l 명령 .

파트 3-영원히들을 수 있도록

이전 부분에서 ls -l 출력이 표시된 에 명령 수신이 중지 .

대신 다음을 eval "$(cat /path/to/pipe/mypipe)"실행하십시오.

while true; do eval "$(cat /path/to/pipe/mypipe)"; done

(당신은 그것을 할 수 있습니다)

이제 무제한의 명령을 차례로 보낼 수 있으며 첫 번째 명령뿐만 아니라 모두 실행됩니다.

파트 4-재부팅이 발생해도 작동하도록 만들기

유일한주의 사항은 호스트를 재부팅해야하는 경우 "while"루프가 작동을 중지한다는 것입니다.

재부팅을 처리하기 위해 내가 한 일은 다음과 같습니다.

를 붙이 while true; do eval "$(cat /path/to/pipe/mypipe)"; done라는 파일 execpipe.sh#!/bin/bash헤더

잊지 마세요 chmod +x그것을

실행하여 crontab에 추가하십시오.

crontab -e

그리고 추가

@reboot /path/to/execpipe.sh

이 시점에서 테스트하십시오. 서버를 재부팅하고 백업이 완료되면 일부 명령을 파이프에 에코하고 실행 여부를 확인하십시오. 물론 명령의 출력을 볼 수 ls -l없으므로 도움이되지 않지만touch somefile 이 될 것입니다.

또 다른 옵션은 다음과 같이 출력을 파일에 저장하도록 스크립트를 수정하는 것입니다.

while true; do eval "$(cat /path/to/pipe/mypipe)" &> /somepath/output.txt; done

이제 실행 ls -l및 출력 (stdout 및 stderr 모두&> bash에서 )은 output.txt에 있어야합니다.

5 부-Docker와 함께 작동하도록 만들기

나처럼 docker compose와 dockerfile을 모두 사용하는 경우 다음 작업을 수행했습니다.

/hostpipe컨테이너에서 와 같이 mypipe의 상위 폴더를 마운트한다고 가정 해 보겠습니다.

이거 추가 해봐:

VOLUME /hostpipe

마운트 지점을 만들기 위해 dockerfile에서

그런 다음 이것을 추가하십시오.

volumes:
   - /path/to/pipe:/hostpipe

도커에서 / path / to / pipe를 / hostpipe로 마운트하기 위해 파일을 작성하십시오.

Docker 컨테이너를 다시 시작하십시오.

6 부-테스트

Docker 컨테이너로 실행하십시오.

docker exec -it <container> bash

마운트 폴더로 이동하여 파이프를 볼 수 있는지 확인하십시오.

cd /hostpipe && ls -l

이제 컨테이너 내에서 명령을 실행 해보십시오.

echo "touch this_file_was_created_on_main_host_from_a_container.txt" > /hostpipe/mypipe

그리고 작동합니다!

경고 : OSX (Mac OS) 호스트와 Linux 컨테이너가있는 경우 작동하지 않습니다 (설명은 여기 https://stackoverflow.com/a/43474708/10018801 및 발행은 여기 https://github.com/docker / for-mac / issues / 483 ) 파이프 구현이 동일하지 않기 때문에 Linux에서 파이프에 쓴 내용은 Linux에서만 읽을 수 있고 Mac OS에서 파이프에 쓴 내용은 Mac OS (이 문장은 정확하지 않을 수 있지만 크로스 플랫폼 문제가 존재한다는 점만 기억하십시오).

예를 들어, Mac OS 컴퓨터에서 DEV에서 Docker 설정을 실행하면 위에서 설명한대로 명명 된 파이프가 작동하지 않습니다. 그러나 스테이징 및 프로덕션에서는 Linux 호스트 및 Linux 컨테이너가 있으며 완벽하게 작동합니다.

7 부-Node.JS 컨테이너의 예

다음은 노드 js 컨테이너에서 기본 호스트로 명령을 보내고 출력을 검색하는 방법입니다.

const pipePath = "/hostpipe/mypipe"
const outputPath = "/hostpipe/output.txt"
const commandToRun = "pwd && ls-l"

console.log("delete previous output")
if (fs.existsSync(outputPath)) fs.unlinkSync(outputPath)

console.log("writing to pipe...")
const wstream = fs.createWriteStream(pipePath)
wstream.write(commandToRun)
wstream.close()

console.log("waiting for output.txt...") //there are better ways to do that than setInterval
let timeout = 10000 //stop waiting after 10 seconds (something might be wrong)
const timeoutStart = Date.now()
const myLoop = setInterval(function () {
    if (Date.now() - timeoutStart > timeout) {
        clearInterval(myLoop);
        console.log("timed out")
    } else {
        //if output.txt exists, read it
        if (fs.existsSync(outputPath)) {
            clearInterval(myLoop);
            const data = fs.readFileSync(outputPath).toString()
            if (fs.existsSync(outputPath)) fs.unlinkSync(outputPath) //delete the output file
            console.log(data) //log the output of the command
        }
    }
}, 300);

이것은 잘 작동합니다. 보안은 어떻습니까? 이것을 사용하여 실행중인 컨테이너 내에서 도커 컨테이너를 시작 / 중지하고 싶습니까? docker 명령 실행을 제외하고 권한없이 dockeruser를 만드나요?
Kristof van Woensel

4

포트 (예 : 8080)에서 수신 대기하는 간단한 서버 파이썬 서버를 작성하고, -p 8080 : 8080 포트를 컨테이너에 바인딩하고, localhost : 8080에 HTTP 요청을 수행하여 popen으로 쉘 스크립트를 실행하는 파이썬 서버에 요청하고, curl 또는 HTTP 요청을 만드는 코드 작성 curl -d '{ "foo": "bar"}'localhost : 8080

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess
import json

PORT_NUMBER = 8080

# This class will handles any incoming request from
# the browser 
class myHandler(BaseHTTPRequestHandler):
        def do_POST(self):
                content_len = int(self.headers.getheader('content-length'))
                post_body = self.rfile.read(content_len)
                self.send_response(200)
                self.end_headers()
                data = json.loads(post_body)

                # Use the post data
                cmd = "your shell cmd"
                p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
                p_status = p.wait()
                (output, err) = p.communicate()
                print "Command output : ", output
                print "Command exit status/return code : ", p_status

                self.wfile.write(cmd + "\n")
                return
try:
        # Create a web server and define the handler to manage the
        # incoming request
        server = HTTPServer(('', PORT_NUMBER), myHandler)
        print 'Started httpserver on port ' , PORT_NUMBER

        # Wait forever for incoming http requests
        server.serve_forever()

except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        server.socket.close()

IMO 이것이 최선의 대답입니다. 호스트 컴퓨터에서 임의의 명령을 실행하려면 일종의 API (예 : REST)를 통해 수행해야합니다. 이것이 보안을 강화하고 실행중인 프로세스를 적절하게 제어 할 수있는 유일한 방법입니다 (예 : 종료, stdin 처리, stdout, 종료 코드 등). 물론이 API가 Docker 내에서 실행될 수 있다면 좋겠지 만 개인적으로 호스트에서 직접 실행해도 괜찮습니다.
barney765

2

내 게으름으로 인해 여기에 답변으로 게시되지 않은 가장 쉬운 해결책을 찾게되었습니다.

그것은 luc juggery위대한 기사 를 기반으로합니다 .

Docker 컨테이너 내에서 Linux 호스트에 대한 전체 셸을 얻으려면 다음을 수행하면됩니다.

docker run --privileged --pid=host -it alpine:3.8 \
nsenter -t 1 -m -u -n -i sh

설명:

--privileged : 컨테이너에 추가 권한을 부여하고 컨테이너가 호스트 (/ dev)의 장치에 액세스 할 수 있도록합니다.

--pid = host : 컨테이너가 Docker 호스트 (Docker 데몬이 실행중인 VM)의 프로세스 트리를 사용할 수 있도록합니다. nsenter 유틸리티 : 기존 네임 스페이스 (컨테이너에 격리를 제공하는 빌딩 블록)에서 프로세스를 실행할 수 있습니다.

nsenter (-t 1 -m -u -n -i sh)를 사용하면 PID 1이있는 프로세스와 동일한 격리 컨텍스트에서 sh 프로세스를 실행할 수 있습니다. 그러면 전체 명령이 VM에 대화 형 sh 셸을 제공합니다.

이 설정은 보안에 중요한 영향을 미치며주의하여 사용해야합니다 (있는 경우).


1
docker run --detach-keys="ctrl-p" -it -v /:/mnt/rootdir --name testing busybox
# chroot /mnt/rootdir
# 

3
이 답변으로 OP의 질문을 해결할 수 있지만 작동 방식과 문제 해결 이유를 설명하는 것이 좋습니다. 이를 통해 새로운 개발자는 진행 상황과이 문제 및 유사한 문제를 스스로 해결하는 방법을 이해할 수 있습니다. 기여해 주셔서 감사합니다!
Caleb Kleveter

1

나는 간단한 접근 방식이 있습니다.

1 단계 : /var/run/docker.sock:/var/run/docker.sock 마운트 (따라서 컨테이너 내에서 도커 명령을 실행할 수 있음)

2 단계 : 아래에서 컨테이너 내부에서 실행합니다. 여기서 핵심 부분은 ( 호스트 컨텍스트에서 실행되므로 --network host )

docker run -i --rm --network host -v /opt/test.sh:/test.sh alpine : 3.7 sh /test.sh

test.sh에는 필요한 모든 명령 (ifconfig, netstat 등)이 포함되어야합니다. 이제 호스트 컨텍스트 출력을 얻을 수 있습니다.


2
호스트 네트워크를 사용하는 네트워킹에 대한 docker 공식 문서에 따르면 "하지만 스토리지, 프로세스 네임 스페이스 및 사용자 네임 스페이스와 같은 다른 모든 방식에서 프로세스는 호스트와 격리됩니다." 확인 -docs.docker.com/network/network-tutorial-host
Peter Mutisya

0

Marcus가 상기시켜 주듯이 도커는 기본적으로 프로세스 격리입니다. docker 1.8부터 호스트와 컨테이너간에 양방향으로 파일을 복사 할 수 있습니다.docker cp

https://docs.docker.com/reference/commandline/cp/

파일이 복사되면 로컬에서 실행할 수 있습니다.


1
알아요. 즉, 도커 컨테이너 내부에서이 스크립트를 실행하는 방법은 무엇입니까?
Alex Ushakov


2
@AlexUshakov : 절대 안돼. 그렇게하면 docker의 많은 장점이 깨질 것입니다. 하지마. 시도하지 마십시오. 해야 할 일을 재고하십시오.
Marcus Müller

또한 블라드의 트릭 참조 forums.docker.com/t/...
user2915097

1
항상 호스트에서 컨테이너의 일부 변수 값을 가져 와서 myvalue=$(docker run -it ubuntu echo $PATH)스크립트 쉘에서 정기적으로 테스트 할 수 있습니다 (물론 $ PATH가 아닌 다른 것을 사용합니다. 단지 예일뿐입니다). 특정 값이면 스크립트를 실행합니다
user2915097 2015-08-23

0

파이프 개념을 사용할 수 있지만 호스트 및 fswatch 의 파일을 사용 하여 도커 컨테이너의 호스트 시스템에서 스크립트를 실행하는 목표를 달성합니다. 그렇게 (자신의 책임하에 사용) :

#! /bin/bash

touch .command_pipe
chmod +x .command_pipe

# Use fswatch to execute a command on the host machine and log result
fswatch -o --event Updated .command_pipe | \
            xargs -n1 -I "{}"  .command_pipe >> .command_pipe_log  &

 docker run -it --rm  \
   --name alpine  \
   -w /home/test \
   -v $PWD/.command_pipe:/dev/command_pipe \
   alpine:3.7 sh

rm -rf .command_pipe
kill %1

이 예에서 컨테이너 내부에서 다음과 같이 / dev / command_pipe에 명령을 보냅니다.

/home/test # echo 'docker network create test2.network.com' > /dev/command_pipe

호스트에서 네트워크가 생성되었는지 확인할 수 있습니다.

$ docker network ls | grep test2
8e029ec83afe        test2.network.com                            bridge              local

-7

user2915097의 응답 을 확장하려면 다음을 수행하십시오.

격리의 개념은 응용 프로그램 / 프로세스 / 컨테이너 (이 시점에서 각도에 관계없이)가 호스트 시스템에 할 수있는 작업을 매우 명확하게 제한 할 수 있다는 것입니다. 따라서 파일을 복사하고 실행할 수 있다는 것은 실제로 전체 개념을 깨뜨릴 것입니다.

예. 그러나 때로는 필요합니다.

아니요. 그렇지 않거나 Docker는 사용하기에 옳지 않습니다. 당신이해야 할 일은 당신이하고 싶은 일에 대한 명확한 인터페이스를 선언하고 (예를 들어, 호스트 설정을 업데이트하는 것) 최소한의 클라이언트 / 서버를 작성하여 정확히 그렇게하는 입니다. 그러나 일반적으로 이것은 그다지 바람직하지 않은 것 같습니다. 많은 경우, 단순히 접근 방식을 재고하고 그 필요성을 제거해야합니다. Docker는 기본적으로 모든 것이 일부 프로토콜을 사용하여 도달 할 수있는 서비스 였을 때 존재했습니다. Docker 컨테이너가 호스트에서 임의의 항목을 실행할 권한을 갖는 적절한 사용 사례를 생각할 수 없습니다.


유스 케이스가 있습니다 : Dockerized 서비스 A(github의 src)가 있습니다. 에서 AREPO 나는 '자식 풀'명령 다음에 새로운 고정 표시기 이미지를 생성하고 실행 (물론 오래된 용기를 제거) 적절한 후크를 만들 수 있습니다. 다음 : github에는 마스터에서 푸시 한 후 임의의 엔드 포인트 링크에 ​​POST 요청을 생성 할 수있는 웹 후크가 있습니다. 그래서 나는 그 끝 점이 될 것이고 HOST 머신의 repo A에서만 'git pull'을 실행할 dockerized service B를 만들고 싶지 않습니다 (중요 : 명령 'git pull'은 B 환경이 아니라 B ​​환경에서 실행되어야합니다. B 내부에서 새 컨테이너 A를 실행할 수 없습니다 ...)
Kamil Kiełczewski 2017 년

1
문제 : 나는 linux, git 및 docker를 제외하고 HOST에 아무것도 갖고 싶지 않습니다. 그리고 나는 dockerizet 서비스 A와 서비스 B를 갖고 싶습니다 (사실 누군가가 master에서 git push를 한 후 repo A에서 git pull을 실행하는 git-push 핸들러입니다). 그래서 자식 자동 배포는 문제가 사용 사례입니다
카밀 Kiełczewski

@ KamilKiełczewski 나는 정확히 똑같이하려고 노력하고 있는데, 해결책을 찾았습니까?
user871784

1
"아니요, 그렇지 않습니다"라는 말은 좁은 마음으로 전 세계의 모든 사용 사례를 알고 있다고 가정합니다. 우리의 사용 사례는 테스트를 실행하는 것입니다. 환경을 올바르게 테스트하려면 컨테이너에서 실행해야하지만 테스트의 특성상 호스트에서도 스크립트를 실행해야합니다.
Senica Gonzalez

1
왜 내가 -7 대답을 남기는 지 궁금해하는 사람들을 위해 : a) 오류가 있어도 괜찮습니다. 내가 틀렸어. 여기에 문서화해도 괜찮습니다. b) 의견은 실제로 가치를 기여합니다. 답변을 삭제하면 답변도 삭제됩니다. c) 여전히 고려하는 것이 현명 할 수있는 관점에 기여합니다 (필요하지 않은 경우 고립을 깨뜨리지 마십시오.하지만 때로는 그래야합니다).
Marcus Müller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.