今天來用 Flask 寫一個 API Gateway 的 service,這個微服務的架構長這樣
.
├── conf
│ └─── config.ini
├── data
├── Dockerfile
├── requirements.txt
├── run.sh
├── src
│ └─── api.py
└── wsgi.py
可以看出這是一個典型的 flask project 架構,主要有 conf/ 與 src/ 及其他必要的檔案。
另一個值得關注的議題是,我們希望在開發與部署時,執行的環境盡量一樣。我們可以透過 soft link 的方式,將 host VM 上的 python 與 docker 內要掛起的 python 作 alias ,這樣在包 docker 的時候就可以不必 rename。
詳細的 python 怎麼寫,我們就不在這裡示範了,我們看 Dockerfile 及 ansible 的 Yaml 即可。
$ cat flask.mytodos/Dockerfile
FROM centos:7.5.1804
MAINTAINER yi_de_wu@trendmicro.com
RUN useradd -ms /bin/bash centos && \
passwd -d centos && \
gpasswd -a centos wheel
WORKDIR /opt/aisoc/aisoc-flask
COPY . .
RUN chown centos:centos /opt/mytodos -R && \
yum install -y epel-release gcc sudo curl net-tools telnet vim which wget && \
yum install -y python36 python36-devel python36-setuptools postgresql10-devel openssl-devel && \
easy_install-3.6 pip && \
pip install --no-cache-dir -r requirements.txt && \
ln -s /usr/bin/python3.6 /usr/local/bin/python3-mytodos
USER centos
CMD ["/bin/sh", "run.sh"]
$ cat ansible/roles/tasks/run_flask.yaml
- name: Copy File | Copy Conf to Remote
vars:
hostname: "{{ ansible_facts['hostname'] }}"
template:
src: "{{ dev_dir }}/ansible/files/conf.d/flask.ini.j2"
dest: "{{ prd_dir }}/mytodos-flask/conf/config.ini"
- name: Docker | Start flask.mytodos
docker_container:
name: flask.mytodos
state: started
domainname: flask.mytodos
image: "path.to.your.docker.registry/team-name/mytodos-flask:{{ img_ver }}"
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /usr/share/zoneinfo/UTC:/etc/localtime:ro
- "{{ prd_dir }}/mytodos-flask/conf:{{ prd_dir }}/mytodos-flask/conf:ro"
- "{{ prd_dir }}/mytodos-flask/log:{{ prd_dir }}/mytodos-flask/log"
networks:
- name: mynet
aliases: flask.mytodos
ipv4_address: 172.20.0.4
links:
- postgresql.mytodos
ports:
- '9000:9000'
recreate: true