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
'ProgramingTip' 카테고리의 다른 글
CardView 배경색 상태가 존중되지 않음 (0) | 2020.12.30 |
---|---|
Python 3.3의 해시 함수는 세션간에 다른 결과를 반환합니다. (0) | 2020.12.30 |
하나 워커 : 누락 된 dll (0) | 2020.12.30 |
ansible 플레이 북 파일에 ssh 키 지정 (0) | 2020.12.30 |
'None is None is None'이 True를 반환하는 이유는 무엇입니까? (0) | 2020.12.30 |