【Flagr】處理部署遇到 fcntl64 not found 的過程

前言
睽違三個月左右再度重新部署 Flagr,沒想到在這次部署超級不順利,搞不清楚到底是環境變數沒弄好,還是是 Dockerfile 有問題,遇到 fcntl64 not found 的問題,直到這幾天跟同學 pair programming 進 Bash 時才抓漏成功,以下就跟大家分享一下這次的過程。
分類

睽違三個月左右再度重新部署 Flagr,沒想到在這次部署超級不順利,搞不清楚到底是環境變數沒弄好,還是是 Dockerfile 有問題,遇到 fcntl64 not found 的問題,直到這幾天跟同學 pair programming 進 Bash 時才抓漏成功,以下就跟大家分享一下這次的過程。
最近剛好看到許多EKS、GKE相關的文章,趁著過年時刻先來補足一下 Docker 這個既熟悉又陌生的技能 😆,之後再接著研究如何串接至 kubernetes 並同時到雲平台上,接下來一起來看我從建立到建置的過程紀錄 🙂。
以下就使用我的 side project - Twitch-Bot 做範例囉!
主要使用的功能為
node以及mongo
這邊我使用 vscode 的 Docker extension 來幫助我快速建立 docker 相關的檔案:
透過以下的 gif 可以快速建立以上三個檔案

操作方式為 Cmd+Shift+P >docker: add > 選擇語言(Node) > 設定輸出 Port
藉由 extension 來幫我們產生檔案第一步就完成了,接著對 Dockerfile 稍做修改:
FROM node:10.13-alpine
MAINTAINER NiJia <louis70109@gmail.com>
ENV NODE_ENV production
WORKDIR /app
COPY ["package.json", "package-lock.json*", "/app/"]
RUN npm install
COPY . /app/
EXPOSE 5000
CMD ["npm", "start"]
/app這個工作資料夾當作範例)。package.json 以及 package-lock.json 先複製進 /app/ 這個資料夾內。. = 當前目錄這邊我將預設的修改為:
version: '3'
services:
twitch-bot:
image: twitch-bot
restart: always
build: .
environment:
NODE_ENV: production
ports:
- 5000:5000
depends_on:
- mongo
networks:
- chatbot-network
mongo:
image: mongo
restart: always
volumes:
- ./data/db:/data/db
networks:
- chatbot-network
networks:
chatbot-network:
driver: bridge
首先將version改成 3,有向下相容的話當然就是要使用新的囉!
接著會建立兩個 container (services):
build 後面接著 . 是指說建立在當前位置,depends_on 則是依賴哪個 container,最後則透過 networks (chatbot-network) 來讓服務互相溝通。restart鐵定是必要設定,不然會沒有資料庫 🤣,volumes則是設定說你想映射的檔案位置在哪,這邊我設定當前目錄的/data/db (./data/db)裡面,對應到映像檔裡面的 /data/db 的位置,然後一樣透過 networks (chatbot-network) 來讓服務溝通。networks 這邊就有點像主機設定網卡一樣,我設定一個 chatbot-network 的網卡它是使用橋接(bridge)模式來驅動(driver)
這部分是參考知乎,對照改出來的
補給站: 一般看到
5000:5000或是./data/db:/data/db的寫法,它意思是 本地端位置 對應「:」到 容器的位置,像上述檔案就有 port 以及 資料庫位置,這邊就會因應服務而對應到不同的功能。
這邊因為我很偷懶不想把.env裡的環境變數寫進dockerfile😆,因此在這就把檔案中的**/.env拔掉方便做事 🤣
docker-compose up -d
-d 表示讓容器跑在背景,如果沒加的話就會在終端機上看到容器們的行為。docker-compose down
npx ngrok http 5000 來建立一個暫時含有 SSL 的 URL。如果是按照原本 docker-compose.yml 的打法:
services:
twitch-bot:
image: twitch-bot
這樣的話 docker 預設會幫忙下一個 latest 版號的 tag。
如果是按造以下做法的話在 build 就會幫忙建立 帳號/容器名,並下一個 0.1 的 tag
services:
twitch-bot:
image: louis70109/twitch-bot:0.1

接下來就執行 docker-compose build 幫忙建立一個有版本號(tag)的容器映像檔(container image)。

補給站:
- 記得要
docker login哦!- 到 dockerhub 或其他私有倉庫建立 container repository
趁著春節的零碎時間來跟這個熟悉陌生技能打個招呼 😆,同時也體會到大家說到 docker 好用的地方以及給予的彈性,之前都是有需要測試某些功能才會用到,對於 dockerfile 以及 docker-compose.yml 就甚少了解,藉著年假空檔練習,之後只要在熟悉一下整體的使用方法應該就能好好的~用它來幫忙做事了 🚀。
連線 mongo container docker CMD 使用 Overview of Docker Compose Twitch-Bot
詳細文件參考
docker 抓 mysql 最新的版本
docker pull mysql:tag
若只是要建立普通容器用以下指令:
docker run -d -p 3306:3306 -e MYSQL_USER="myname" -e MYSQL_PASSWORD="mypasswd" -e MYSQL_ROOT_PASSWORD="root_pwd" --name mysqltest1 mysql:5.7 --character-set-server=utf8 --collation-server=utf8_general_ci
由於會有備份的問題,所以要先建立資料夾們
mkdir ~/docker
mkdir ~/docker/mysql
mkdir ~/docker/mysql/conf
mkdir ~/docker/mysql/data
新增 my.cnf 配置文件
vim ~/docker/mysql/conf/my.cnf
my.cnf 加入如下内容:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
將 /docker 這個資料夾映射到容器內的 /etcmysql/my.cnf
docker run -d -p 3306:3306 --privileged=true -v ~/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v ~/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysqltest2 mysql:5.7
如此一來就可以儲存 /docker 這個資料夾達到備份的功能
將 myadmin 連接 mysql 的容器指令:
docker run --name myadmin -d --link mysql_db_server:db -p 9100:80 phpmyadmin/phpmyadmin
mysql_db_server = mysql container id
在瀏覽器上輸入 localhost:9100 就可以看到 phpmyadmin 囉!
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id