Docker가 Skype을 시작하고 Slack에 메시지를 전달하기 전에

12199 단어 Docker

배경.


사무실 안에서 임시로 만들어진 스카이프 정보를 슬랙에 던지는 프로그램은 (인위적으로) 정전이 되면 떨어지기 때문에 컨테이너를 녹여 사무실 밖으로 내놓을 때가 많지 않을 것 같다.

현상


Skype는 Xvfb에 대한 상승을 DBus, Skype2Py 스크립트를 통해 메시지를 추출하여 Slack API로 전송하는 구조입니다.

차리다


오랜만에 boot2 docker니까 upgrade부터
$ boot2docker upgrade
Backing up existing docker binary...
Downloading new docker client binary...
Success: downloaded https://get.docker.com/builds/Darwin/x86_64/docker-latest
    to /usr/local/bin/docker
    The old version is backed up to ~/.boot2docker.
Backing up existing boot2docker binary...
Downloading new boot2docker client binary...
Success: downloaded https://github.com/boot2docker/boot2docker-cli/releases/download/v1.5.0/boot2docker-v1.5.0-darwin-amd64
    to /usr/local/bin/boot2docker
    The old version is backed up to ~/.boot2docker.
Latest release for boot2docker/boot2docker is v1.5.0
Downloading boot2docker ISO image...
Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso
    to /Users/hac/.boot2docker/boot2docker.iso
1.5살이에요.
Slack 측에서 Skype의 소식을 받는 채널의 제작과 API의 영패 발행을 진행한다.

Docker file 쓰기

$ mkdir skype2slack
$ cd skype2slack
$ nano Dockerfile
극도의 e 또는 나노팬입니다.
Dockerfile.
FROM debian:stable
# debconfにnon-interactiveモードであることを教える
ENV DEBIAN_FRONTEND noninteractive
# i386アーキテクチャのものも追加する
RUN dpkg --add-architecture i386
# 必要なパッケージをまずは導入
RUN apt-get update
RUN apt-get -y install x11vnc xvfb fonts-takao openbox wget

# Skypeをダウンロード
RUN wget http://download.skype.com/linux/skype-debian_4.3.0.37-1_i386.deb
# 依存性を無視してSkypeをとりあえずインストール
RUN dpkg -i skype-debian_4.3.0.37-1_i386.deb || true
# 不足している依存パッケージのインストール
RUN apt-get -fy install

# Skype4Pyとpyslackを準備
RUN apt-get -y install python python-pip git
RUN pip install Skype4Py
RUN pip install requests
RUN pip install pyslack
# skype2slackスクリプトを配置
ADD skype2slack.py /
RUN mv /skype2slack.py /root

# x11vncにパスワードを設定
RUN mkdir /root/.vnc
RUN x11vnc -storepasswd [パスワード] /root/.vnc/passwd

# タイムゾーンとロケールを設定
RUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8 || :
RUN echo "Asia/Tokyo" > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata

# 起動スクリプトを押し込める
ADD startup.sh /
RUN mv startup.sh /root

ENTRYPOINT ["/bin/bash"]
CMD ["/root/startup.sh"]

EXPOSE 5900
시작 스크립트 여기 있습니다.
startup.sh
#/bin/bash
rm -f /tmp/.X1-lock
rm -fr /tmp/.X11*
rm -fr /tmp/*
rm -fr /root/.Xauthority
# なぜか自分のMacでは数秒待たないと消えない
sync; sync; sync;
sleep 3s
# 他の環境では問題なかった
Xvfb :1 -extension GLX -screen 0 1024x768x24 &
x11vnc -display :1 -bg -usepw -forever
DISPLAY=:1 /usr/bin/openbox-session &
DISPLAY=:1 XAUTHORITY=/root/.Xauthority python /root/skype2slack.py &
DISPLAY=:1 skype
스카이프는 구조 창을 열어 사용자가 확인할 수 있도록 하는 장면이 있는데, 테두리가 없으면 그 창을 삭제할 수도 없고 이동할 수도 없다.그래서 오픈박스를 창 관리자로 하기로 했습니다.
그리고 언어 환경에 대한 UTF-8 지도가 없어요!다들 넣었나봐요. 그냥 흉내만 내본 것 뿐이에요...
만약 누군가가 사용한다면 x11vnc의 비밀번호를 마음대로 결정하십시오.

skype2slack.py 설정


그런 다음 Docker file과 같은 디렉토리에 있는 skype2slack입니다.py 설정
skype2slack.py
#coding: utf-8
import os
import time
import requests
import Skype4Py
import slack.chat

def handler(msg, event):
    slack.api_token = os.environ["SLACK_TOKEN"]
    channel = os.environ["SLACK_CHANNEL"]
    print "Event %s: %s" % (event, msg)
    if (event == u"RECEIVED") or (event == u"SENT"):
            slack.chat.post_message(channel, msg.Body, username=msg.FromDisplayName)

def main():
    time.sleep(10)
    skype = Skype4Py.Skype(Transport='x11')
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1)

requests.packages.urllib3.disable_warnings()
if __name__ == "__main__":
    main()
우선 슬립으로 10초만 기다리세요.Skype 이전에 이미 이 스크립트가 시작되었기 때문입니다.
이후 RECEIVED 및 SENT 활동 중에 슬랙에 메시지를 보냅니다.
Slack API용 토큰(SLACK TOEN)과 채널(SLACK CHANNEL)은 컨테이너가 시작될 때 환경 변수로 전달되기를 원합니다.
4requests.packages.urllib3.disable_warnings() 부르는 곳이지만 psylack 모듈은 내부에서 Requests를 사용하고 통신에서 자꾸 Warning을 뱉는 것을 억제한다

이미지 만들기

$ docker build -t skype2slack:latest .
너무 길다
담배 세 개비랑 커피도 괜찮아요.

일단 첫 시동.

$ docker run -p 5900:5900 -e SLACK_TOKEN="xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXX" -e SLACK_CHANNEL="#skype-proxy" skype2slack:latest bash /root/startup.sh
환경 변수를 통해 토큰과 채널을 시작합니다
$ boot2docker ip
192.168.59.103
Mac에서 vnc:/192.168.559.103 연결을 바로 입력하면 이전에 Docker file에서 지정한 비밀번호를 입력해야 합니까?

시동이 잘 걸린 것 같습니다.

Skype 계정에 로그인할 때 자동 로그인 확인을 잊지 마십시오.

이 상태로 추진할 수 있다면, 먼저 용기를 멈추고 미리 인상을 제출해야 한다.
Skype에 대한 인증 정보를 저장하는 것이 목적입니다.
$ docker ps
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                    NAMES
930ce7c5f3d7        skype2slack:latest   "bash /root/startup.   4 minutes ago       Up 4 minutes        0.0.0.0:5900->5900/tcp   pensive_galileo
$ docker stop 930ce7c5f3d7
930ce7c5f3d7
$ docker commit 930ce7c5f3d7 skype2slack-run:latest
033784851a53c77f49d4ecffdebf7a087cd54c7f6c152f0f37d1c7661e0df493
이렇게 스카이피 2slack-run:latest라는 이름으로 제출되었습니다.

두 번째 부팅


방금 제출한skype2slack-run:latest를 시작합니다.
$ docker run -p 5900:5900 -e SLACK_TOKEN="xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXX" -e SLACK_CHANNEL="#skype-proxy" skype2slack-run:latest /bin/bash /root/startup.sh
두 번째 시작 시 Skype는 skype2slack에 대응합니다.py가 연결을 요청할 것입니다.
이 선택을 기억하고 예를 선택합니다.

다음 화면에서 Skype 4Py와 Skype 연결을 확인할 수 있습니다.

그럼, 여기까지의 상황을 다시 그들에게 제출합시다.
$ docker ps
CONTAINER ID        IMAGE                    COMMAND                CREATED              STATUS              PORTS                    NAMES
5ceb3f3b96ab        skype2slack-run:latest   "/bin/bash /root/   About a minute ago   Up About a minute   0.0.0.0:5900->5900/tcp   trusting_mcclintock
$ docker stop 5ceb3f3b96ab
5ceb3f3b96ab
$ docker commit 5ceb3f3b96ab skype2slack-run:latest
101643e8d66983e2dd2c22481a10aca822fed9d74a105b9bf2b520f856e66809

본격 운행

$ docker run --rm -p 5900:5900 -e SLACK_TOKEN="xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXX" -e SLACK_CHANNEL="#skype-proxy" skype2slack-run:latest /bin/bash /root/startup.sh
길었어
Skype 계정으로 메시지를 보내면 슬랙 채널로 자동 전송됩니다.
슬랙 옆 아이콘 등도 스카이프가 되면 혼란스럽지 않아요.
참고로 이동 중인stats는 이런 느낌입니다.
CONTAINER           CPU %               MEM USAGE/LIMIT       MEM %               NET I/O
93664c636361        11.19%              121.4 MiB/1.961 GiB   6.05%               359.3 KiB/718.5 KiB
생각보다 무겁네.

최후


이번에 Docker에서 스카이프를 시도했지만 GUI만 설정할 수 있는 부분이 전혀 없어 운용 대응으로 아쉬웠다.
그리고 이유는 모르겠지만 스크립트를 시작하는 rm 명령이 순조롭게 작동하지 않거나 작동하지 않습니다.
자물쇠 파일이 사라지지 않으면 X를 시작할 수 없습니다. 오류가 발생했습니다. 이것은 boot2docker의 문제입니까?
(많을 때는 20번 정도 시동이 걸리지 않습니다.)
사장의 맥북 에어(Docker 1.3)는 이 문제가 발생하지 않을 것으로 보고 자신의 환경만 생각하고 있다.
그리고 이 skype2slack 스크립트는 모든 정보를 다 줍지 못한 것 같다(회사 내담)
일지에서 어떤 이벤트를 주웠는지 몰라서 판명 후에 기사를 갱신하고 싶어요.
허봇 쪽에서도 재생을 해보면 정보의 차이를 알 수 있을 거예요.

좋은 웹페이지 즐겨찾기