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,這樣就解決成功了!