實戰 Docker File

Docker 的 Pokemon 農場

寫在前面

  • 此教學不提供 Github、dockerfile
  • 僅供學習交流使用,任何個人和組織均不得將其用于商業用途
  • 此教學不代表本公司立場

不自殺聲明

本人在此特地聲明:
 
本人樂觀開朗,身體健康,
無任何使我困擾之慢性病或心理疾病,故絕不可能做出任何看似自殺之行為。
 
本人從無睡眠困擾,故不需服用安眠藥。
本人不酗酒亦不吸毒,也絕不會接近下列地點──
1. 開放性水域
2. 無救生員之游泳池
3. 有高壓、危險氣體,或密閉式未經抽氣處理之地下室、蓄水池、水桶等
4. 無安全護欄之任何高處
5. 任何施工地點(拆政府除外),包括製作消波塊之工地
6. 任何以上未提及但為一般人正常不會前往之地點
 
本人恪遵下列事項──
1. 車輛上路前會檢查煞車部件、油門線等,並會在加油前關閉車輛電源與行動電話。
2. 絕不擅搶黃燈、闖紅燈。
3. 乘坐任何軌道類交通工具一定退到警戒線後一步以上,直到車輛停妥。
4. 騎乘機車必戴安全帽;乘車必繫安全帶。
5. 絕不接近任何會放射對人體有立即危害的輻射之場所(如核電廠)或設備。
6. 颱風天不登山、不觀浪。
 
本人將盡可能注意電器、瓦斯、火源之使用。
本人居住之房屋均使用符合法規之電路電線,絕無電線走火之可能;
也絕未在家中放置過量可燃性氣體或液體。
浴室中除該有之照明外,不放置任何電器用品,
並在睡覺前關閉除電燈、冰箱、電扇外之所有電器開關。
 
本人絕不會與隨機的不明人士起衝突,並盡可能保護自我人身安全。

傅耀德 

Fuyaode

  • 創科資訊 全端工程師
  • React Native Taiwin 社群創辦人之一
  • Hello JS 講師
  • 熟悉 Node DevOps  開發流程
  • 不會 Python....

今天我要來聊聊

很夯的 pokemon

Pokemon go?

關 Docker 屁事!

我們都知道Pokemon GO

有很多負面新聞

  • 搶劫
  • 車禍
  • 溺斃
  • 塞車
  • 沒前途

今天我們有完美的解決方案

Docker x Pokemon

優點與解決問題

  • 不流汗
  • 隨手環保
  • 解決交通問題
  • 提升工具人技能點
  • 有錢途

所以大家有聽過

PokemonGo-Bot嗎?

使用 Pokemon Go api 的開源項目已經多到滿出來拉!!!

為了學習 Docker....

只好撩落去了....

PokemonGo-Bot剛好有 Docker 版

大家都知道我不會 Python...

這是安裝教學

這是免安裝

直接使用Docker教學

直接複製貼上我就能開始

當專業工具人拉!!!

$ docker run 
    -it 
    -v $(pwd)/configs/config.json:/usr/src/app/configs/config.json 
    pokemongo-bot

那~麼厲害?!

呵呵 這就是 Docker

而且 Docker 還有一個好處

我一次能幫十幾二十個妹紙掛

多執行緒你懂嗎?

那我們來看看怎麼寫

Dockerfile

 

官方  Dockerfile

FROM python:2.7

WORKDIR /usr/src/app
VOLUME ["/usr/src/app/configs", "/usr/src/app/web"]

ARG timezone=Etc/UTC
RUN echo $timezone > /etc/timezone \
    && ln -sfn /usr/share/zoneinfo/$timezone /etc/localtime \
    && dpkg-reconfigure -f noninteractive tzdata

RUN cd /tmp && wget "http://pgoapi.com/pgoencrypt.tar.gz" \
    && tar zxvf pgoencrypt.tar.gz \
    && cd pgoencrypt/src \
    && make \
    && cp libencrypt.so /usr/src/app/encrypt.so \
    && cd /tmp \
    && rm -rf /tmp/pgoencrypt*

ENV LD_LIBRARY_PATH /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

ENTRYPOINT ["python", "pokecli.py"]

FROM

FROM python:2.7

WORKDIR

WORKDIR /usr/src/app

VOLUME

VOLUME 
["/usr/app/configs",
"/usr/src/app/web"]

ARG

ARG timezone=Etc/UTC

RUN

RUN echo $timezone > /etc/timezone \
    && ln -sfn /usr/share/zoneinfo/$timezone /etc/localtime \
    && dpkg-reconfigure -f noninteractive tzdata

RUN cd /tmp && wget "http://pgoapi.com/pgoencrypt.tar.gz" \
    && tar zxvf pgoencrypt.tar.gz \
    && cd pgoencrypt/src \
    && make \
    && cp libencrypt.so /usr/src/app/encrypt.so \
    && cd /tmp \
    && rm -rf /tmp/pgoencrypt*

ENV

ENV LD_LIBRARY_PATH /usr/src/app

COPY

COPY . /usr/src/app

ENTRYPOINT

ENTRYPOINT 
["python", "pokecli.py"]

再複習一遍官方  Dockerfile

FROM python:2.7

WORKDIR /usr/src/app
VOLUME ["/usr/src/app/configs", "/usr/src/app/web"]

ARG timezone=Etc/UTC
RUN echo $timezone > /etc/timezone \
    && ln -sfn /usr/share/zoneinfo/$timezone /etc/localtime \
    && dpkg-reconfigure -f noninteractive tzdata

RUN cd /tmp && wget "http://pgoapi.com/pgoencrypt.tar.gz" \
    && tar zxvf pgoencrypt.tar.gz \
    && cd pgoencrypt/src \
    && make \
    && cp libencrypt.so /usr/src/app/encrypt.so \
    && cd /tmp \
    && rm -rf /tmp/pgoencrypt*

ENV LD_LIBRARY_PATH /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

ENTRYPOINT ["python", "pokecli.py"]

寫好 Dockerfile 後

來 build image 吧!

$docker build 
    --build-arg timezone=Europe/London 
    -t pokemongo-bot ./

然後就可以

快快樂樂地執行了

$ docker run 
    -it 
    -v $(pwd)/configs/config.json:/usr/src/app/configs/config.json 
    pokemongo-bot

那這串 docker run 在幹麻?

-it 可以讓你在 docker 裡面下 cmd 和看 log

-v 路徑:docker內的路徑 掛載檔案進 docker

最後面有個 pokemongo-bot 代表 image 名稱

那我要在背景執行怎麼辦?

-d 背景執行

--name=名稱

命名這次 run 的名稱方便等等看 log

背景執行怎麼看 log?

$docker logs name -f

好還要更好!!

工具人那麼多

你要怎麼有競爭力?

這世界是講求效率的!

每次改 config 再 run

煩不煩啊?

大家還記得 ENV 嗎?

可以傳入變數變成environment

那是不是可以把config 傳進去替換掉 config?

像是這樣

$ docker run 
    --name=40018217 
    -d 
    -e CONFIG="/test.json" 
    -e LOGIN="ptc"
    -e BASE="./configs/path.json"
    -e USERNAME=""
    -e PASS="" 
    -e LOCATION="" 
    -v $(pwd)/configs:/usr/src/app/configs 
    pokemongo-bot

加上一行 code

CMD cat $BASE | jq ".auth_service=\"$LOGIN\" > $CONFIG \
    && cat $CONFIG \
    && ./run.sh $CONFIG

CMD

docker run 會馬上執行的部分

剛剛那行就能幫你替換 config 的變數

Dockerfile 指令整理

  • FROM - Base 某個 docker image
  • WORKDIR - 為後續的 指令指定工作目錄
  • VOLUME - 建立可以從本地端或其他容器掛載的掛載點
  • ARG - Build image 時能傳入的參數
  • RUN -  build image 會執行的 script
  • ENV - 啟動容器時的環境變數
  • COPY - 複製本地端的檔案、資料夾到容器中的
  • ENTRYPOINT - 指定容器啟動後執行的命令
  • CMD - 啟動容器時執行的命令
  • EXPOSE - 設定 Docker 伺服器容器對外的埠號,供外界使用

當然

一次幫太多妹紙

養神奇寶貝是很累的

所以要有一個 UI 管理!

Demo

最後....

不要再宅在家了

至少也出門抓個神奇寶貝吧?

實戰 Docker

By fuyaode

實戰 Docker

  • 2,283