dockerd 預設只使用 /var/run/docker.sock,如果需要讓其他的 host 去管理,就需要額外設定。
在 Ubuntu trusty 裡,要編輯 /etc/default/docker,加入
DOCKER_OPTS="-H 0.0.0.0:2375"
然後重新啟動就可以了。
不過這樣設定以後,就等於任何人都可以透過這個 port 去控制你這台機器裡的所有 container ,官方建議加上 TLS 來保障連線的安全,晚點再來研究怎麼加上 TLS 。
參考資料:
Just thinking more…
dockerd 預設只使用 /var/run/docker.sock,如果需要讓其他的 host 去管理,就需要額外設定。
在 Ubuntu trusty 裡,要編輯 /etc/default/docker,加入
DOCKER_OPTS="-H 0.0.0.0:2375"
然後重新啟動就可以了。
不過這樣設定以後,就等於任何人都可以透過這個 port 去控制你這台機器裡的所有 container ,官方建議加上 TLS 來保障連線的安全,晚點再來研究怎麼加上 TLS 。
參考資料:
前幾天上傳程式到 openshift 時,發現新版的 six 安裝不上去,原因是 OpenShift 所帶的 six 是 0.3 版,但是無法透過 sudo 等之類的方式來安裝新版,所以想查到底是哪個模組會需要用到新版的 six。上網找了一下,發現 pipdeptree 可以滿足我的需求。
用 pip install pipdeptree 就可以安裝,使用上也很簡單,輸入 pipdeptree 就會列出各個模組的相依性與其所需最低版本。
結果大致是這樣:
Warning!!! Possibly conflicting dependencies found: * HaodooScraper-Flask==1.0 - python-dateutil [required: ==2.3, installed: 2.6.0] - six [required: ==1.3.0, installed: 1.10.0] ------------------------------------------------------------------------ alembic==0.6.7 - Mako [required: Any, installed: 1.0.0] - MarkupSafe [required: >=0.9.2, installed: 0.23] - SQLAlchemy [required: >=0.7.3, installed: 0.9.8] cssselect==0.9.1 Flask-APIBlueprint==1.0.0 - flask [required: >=0.11.1,<1.0, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - six [required: <2.0,>=1.10.0, installed: 1.10.0] HaodooScraper-Flask==1.0 - Flask [required: Any, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - Flask-Bootstrap [required: Any, installed: 3.3.7.1] - dominate [required: Any, installed: 2.3.1] - Flask [required: >=0.8, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - visitor [required: Any, installed: 0.1.3] - Flask-JsonTools [required: Any, installed: 0.1.1.post0] - flask [required: >=0.10.1, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - flask-restplus [required: Any, installed: 0.10.1] - aniso8601 [required: >=0.82, installed: 1.2.0] - python-dateutil [required: Any, installed: 2.6.0] - six [required: >=1.5, installed: 1.10.0] - Flask [required: >=0.8, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - jsonschema [required: Any, installed: 2.6.0] - pytz [required: Any, installed: 2017.2] - six [required: >=1.3.0, installed: 1.10.0] - Flask-WTF [required: Any, installed: 0.14.2] - Flask [required: Any, installed: 0.12] - click [required: >=2.0, installed: 6.7] - itsdangerous [required: >=0.21, installed: 0.24] - Jinja2 [required: >=2.4, installed: 2.9.5] - MarkupSafe [required: >=0.23, installed: 0.23] - Werkzeug [required: >=0.7, installed: 0.12.1] - WTForms [required: Any, installed: 2.1] - lxml [required: Any, installed: 3.4.0] - python-dateutil [required: ==2.3, installed: 2.6.0] - six [required: >=1.5, installed: 1.10.0] - requests [required: Any, installed: 2.13.0] - six [required: ==1.3.0, installed: 1.10.0] - SQLAlchemy [required: Any, installed: 0.9.8] nose==1.2.1 pipdeptree==0.10.1 - pip [required: >=6.0.0, installed: 9.0.1] pkg-resources==0.0.0 PyMySQL==0.6.2 pyOpenSSL==0.14 - cryptography [required: >=0.2.1, installed: 1.8.1] - asn1crypto [required: >=0.21.0, installed: 0.22.0] - cffi [required: >=1.4.1, installed: 1.10.0] - pycparser [required: Any, installed: 2.17] - idna [required: >=2.1, installed: 2.5] - packaging [required: Any, installed: 16.8] - pyparsing [required: Any, installed: 2.2.0] - six [required: Any, installed: 1.10.0] - setuptools [required: >=11.3, installed: 34.3.3] - appdirs [required: >=1.4.0, installed: 1.4.3] - packaging [required: >=16.8, installed: 16.8] - pyparsing [required: Any, installed: 2.2.0] - six [required: Any, installed: 1.10.0] - six [required: >=1.6.0, installed: 1.10.0] - six [required: >=1.4.1, installed: 1.10.0] - six [required: >=1.5.2, installed: 1.10.0] wheel==0.30.0a0
Django queryset 對日期時間的處理已經很完備了,可以透過使用 __year 或 __month 等方式來找到是某年或某月的紀錄。
這兩天碰到的狀況是,資料是 MySQL 時,日期時間的比對 (__year / __month) 失效了。仔細看過文件以後,才發現 MySQL 需要事先設定,使用 mysql_tzinfo_to_sql 載入時區表格才行。
This function performs time zone conversions directly in the database. As a consequence, your database must be able to interpret the value of tzinfo.tzname(None). This translates into the following requirements:
- SQLite: no requirements. Conversions are performed in Python with pytz (installed when you install Django).
- PostgreSQL: no requirements (see Time Zones).
- Oracle: no requirements (see Choosing a Time Zone File).
- MySQL: load the time zone tables with mysql_tzinfo_to_sql.
在終端機 (shell) 裡,輸入下列指令:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
接著重新啟動 MySQL 伺服器即可。
mysql_tzinfo_to_sql 的用法不只一種,我選擇的是最簡單的用法。
安裝 acd_cli 就可以了。
安裝跟使用可以參閱 https://acd-cli.readthedocs.io/en/latest/ ,用 pip3 install
git+https://github.com/yadayada/acd_cli.git 就安裝完了。不想裝到系統 /usr/local 的話,加上 –user,可以裝到 $HOME/.local 裡。
第一次使用要先 acd_cli sync,之後就可以使用上傳等功能了,最方便的是,acd_cli 可以利用 FUSE 掛載在某個資料夾下,這樣就可以用檔案總管或是 rsync 一類的軟體來處理了。
參考資料:
簡單的說,depends_on 跟 links 只保證相依的 container 有啟動,但不保證裏面的服務已經啟動完畢,可以接受服務了。
我找到的解決方法,是利用 wait-for-it 這個 bash script 來測試 container 的 port 是否開啟。docker-compose v3 好像有要試圖解決這問題,不過還沒正式釋出。也是有一些其他的解法,不過,我覺得不是很直覺,就先放著了。
參考資料:
白歆惠,知名的模特兒,後來轉戲劇,演了不少連續劇跟電影,是銷售奇姬的女主角。
最近在 Windows 試 docker-toolbox,想讓外部連線連到 host 時,其實是連接到 在 VM 裡服務的 docker container,所以查了看怎麼做。
結果比想像中還要簡單,就是利用 vboxmanage controlvm 去設定 port forwarding 就可以了。
/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe controlvm vm_name natpf1 "rule1,tcp,,80,,80"
那要刪除掉這條 port forwarding 的規則,用
/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe controlvm vm_name natpf1 delete rule1
即可。
那在 linux 下也可以用同樣的方式來做 port forwarding,唯一的限制是非 root 用戶,沒辦法做 port 1024 以下的 port forwarding。
說明:
參考資料:
演講:https://youtu.be/ZP_QV4ccFHQ
mypy 是靜態型別檢查工具,遵循 PEP484 與 PEP526 這兩個標準
而 PEP484 與 PEP526 這兩個標準最主要的用途是為 Python 加上型別標示,這樣可以更容易找到潛在的錯誤。
pip3 install mypy-lang
def hello(name: str) -> str:
"""foo."""
return "Hello, {}".format(name)
def main() -> None:
"""Main entry."""
hello("John")
def hello(name):
# type: (str) -> str
"""foo."""
return "Hello, {}".format(name)
def main():
# type: () -> None
"""Main entry."""
hello("John")
如果程式沒加 type annotation,那麼執行 mypy
不會有任何問題。 如果有一部份使用了 type annotation,那麼執行 mypy
就會告知有問題。 要強制檢查,可以使用 –disallow-untyped-defs
mypy --disallow-untyped-defs your_program.py
要產生 HTML 報告
mkdir html
mypy --html-report ./html your_program.py
xdg-open ./html/index.html
產生 JUnit XML
mypy --junit-xml JUNIT_XML your_program.py
Dropbox 內部已經在使用。
Natalie Martinez 是 Death Race 的女主角,超正的。
Margot Elise Robbie ,最有名的角色應該就小丑女了吧~ 那個造型實在太經典。這次在大賣空裡有看到她出來客串說明,所以就選了她的照片。