看板 Soft_Job 關於我們 聯絡資訊
※ 引述《MOONY135 (脫俗仙子談無慾)》之銘言: : ※ 引述《MOONY135 (脫俗仙子談無慾)》之銘言: : : 最近在研究docker 容器 : : 想用寫好的go去連mysql : : 這是我的docker-compose檔 : : https://pastebin.com/embed_js/2x5MgY2q : : 這是go連線到mysql的設定 : : https://pastebin.com/embed_js/KrnH2DZ7 : : 當我docker-compose up之後 : : 我從終端機連到mysql 用root權限是可以進去的 : : 也看到已經create好的db : 繼續第二問 想學的是code first的方式 : 用的是spf13/cobra這個套件 他可以根據你對專案下的參數去決定要啟用甚麼服務 : 我想把create table 跟 seed一點資料進mysql這兩件事情在啟動服務之前先做好 : (因為怕orm模型有變動 所以分開到其他專案這樣會很麻煩) : 我的dockerfile最後是這樣寫的 : RUN ["db:reset"] : RUN ["db:seed"] : CMD ["http:start"] : build容器會卡在RUN ["db:reset"]這一段 也試過 : CMD ["db:reset","db:seed","http:start"] : 也都不行 是不是我想法不太對呢? 其實都是對另外一個mysql容器做事情 : 還是我需要用run and sleed呢 先觀念釐清下 CMD跟ENTRYPOINT 在一個dockerfile內 只能使用一次 超過一次的會被忽略掉 用途是啟動時執行 CMD是可替換的command ENTRYPOINT 是必定執行的command 用範例來說 如果你CMD寫了echo hello docker run myimage 這時候會出現hello docker run myimage echo hi 這時候會出現hi 若使用ENTRYPOINT 則必定是出現hello 而RUN可使用多次 是在docker build的時候執行 按照你的需求 如果這些command應該是在 docker run時執行 不是在docker build時執行 所以不可以寫在RUN內 目前多數習慣的用法是 寫一支shell script或是python 在容器啟動時執行 譬如你的例子就是寫一支檔案 entrypoint.sh內容為 #!/bin/bash echo "entrypoint executing" http:start db:reset db:seed echo "entrypoint done" 檔案內容是什麼再自行決定 畢竟大家無法知道你這些指令做什麼事 然後dockerfile最下方補上 COPY entrypoint.sh:/entrypoint.sh ENTRYPOINT ["sh", "/entrypoint.sh"] 如果確定entrpoint有成功執行 還是有問題的話 就是你的cobra問題了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.204.151 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1567919331.A.0D6.html
MOONY135: 感謝09/08 13:29
MOONY135: 目前看logs我覺得應該是有相依的問題 mysql跟我的seed09/08 13:30
MOONY135: db 同時被啟動 應該是要等mysql完全動起來之後再去做see09/08 13:30
MOONY135: d的事情 目前還在找怎樣等待mysql被啟起來09/08 13:31
MOONY135: cobra我在本機上而不是DOCKER上運行的時候沒問題09/08 13:35
在entrypoint.sh內測試連線mysql 有成功連線才下指令就可以了 不過邏輯建議轉用python寫 當然最偷懶的方式就是 Sleep 60啦 ※ 編輯: ripple0129 (1.171.204.151 臺灣), 09/08/2019 13:38:00 ※ 編輯: ripple0129 (1.171.204.151 臺灣), 09/08/2019 13:38:55
MOONY135: 很想sleep 不過現在不急 想說多研究一點正規方式lol 09/08 13:40
MOONY135: 有被m的再多500p(稅前)感謝分享 09/08 16:42
MOONY135: 等我回家再給 09/08 16:43
Amused2Death: 推這篇 09/08 22:10