docker在服務部署的打包上,扮演非常便利的關鍵角色
假設我們需要跑一個ubuntu的容器,容器執行成功時,列印出當前資料夾,那麼我們就可以這樣下指令
sudo docker run -it -d --name test ubuntu /bin/sh -c "ls -l"
當然你也可以選擇把終端掛起來,再逐一輸入你想要的指令,關鍵地方在於少掉”-d” 同時覆蓋初始執行命令(command)- bash,如下:
sudo docker run -it --name test ubuntu bash
# in tty
ls -l
然而如果多容器的應用,你可能會遇上些問題,同樣我們來些假設情境:
- 有1個資料庫(MySQL) 負責服務的資料儲存
- 有1個centOS的作業系統,上面搭載相關可執行檔,它會與前數據庫進行連線並提供服務
那麼我們就可以這樣編寫docker-compose.yml
version: '3.9'
services:
db:
image: mysql/mysql-server:5.7.37
environment:
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: my-secret-pw-**
volumes:
- ./sqls/backup.sql:/docker-entrypoint-initdb.d/init.sql
- ./sqls/my.cnf:/etc/mysql/my.cnf
web:
build: .
restart: always
command:
- sh
- -c
- |
./start &
bash
environment:
DB_HOST: db
DB_PORT: 3306
DB_USER: root
DB_PASSWORD: my-secret-pw-**
DB_NAME: test-db
image: test/service:latest
working_dir: /app
stdin_open: true #for docker run -i
tty: true # for docker run -t
depends_on:
- db
links:
- db
ports:
- 3000:3000
我將上面幾個關鍵地方用粗體標註起來。
command是用來複寫初始化執行環境,我用它來建立一些參數,最關鍵的地方在於末2行的bash。
- ./start & 這是讓執行檔於背景執行
- bash 是為了讓整個終端等候進一步命令不結束
最後還有兩個參數要設定 stdin_open & tty,這樣就解決成功了!