ProgramingTip

Docker 컨테이너의 호스트에서 쉘 펼쳐지는 실행 방법은 무엇입니까?

bestdevel 2020. 12. 30. 23:53
반응형

Docker 컨테이너의 호스트에서 쉘 펼쳐지는 실행 방법은 무엇입니까?


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

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


그것은 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

그러나이 시점에서 컨테이너 내부에서 호스트에 필요한 특정 권한을 허용하기 위해 펼쳐야합니다.


나는 그것이 오래된 질문이라는 것을 알리고 약속은 호스트에 연결하고 다음 SSH과 같은 명령을 실행하는 것입니다.

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

최신 정보

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


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

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

파이프에 액세스 비용을 통해 파이프를 마운트해야합니다.

이것은 SSH가 더 좋을 것입니다 기반 방법)과 유사하지만 호스트 장치로 인식 할 수 있습니다. 또한 인증 정보를 필요가 없습니다.

나의 유일한 경고는 당신이 부여하는 이유에 대해 경고하는 것입니다. 사용자 입력 등으로 자체 업그레이드하는 방법을 정리해야 할 일이지만, 적절한 방법은 인수로 전달하는 것이기 때문에 일부 구성 데이터를 가져 오지 않을 것입니다. / 볼륨을 도커에 넣습니다. 또한 많은 경우에 사실에주의해야합니다.

볼륨에서 확장을 실행하는 것과 같은 다른 답변 중 일부는 전체 시스템 리소스에 액세스 할 수 없기 때문에 일반적으로 작동하지 않지만 상태에 따라 더 정확한 수 있습니다.


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

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

파일이 복사하면 로컬에서 언어 수 있습니다.


OP와 같은 다른 도커 컨테이너 내에서 호스트에서 도커 컨테이너를 시작하려는 경우 청취를 공유하여 호스트에서 실행중인 도커 컨테이너를 도커 컨테이너와 공유 할 수 있습니다.

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

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 단계 : /var/run/docker.sock:/var/run/docker.sock 마운트 (컨테이너 내에서 docker 명령을 수 있음)

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 등)이 포함되어야합니다. 이제 호스트 시나리오 출력을 얻을 수 있습니다.


포트 (예 : 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()

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

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

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

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

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

참조 URL : https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container

반응형