![](/img/trans.png)
[英]can't login to mongoDB in a docker-compose container with login/pass
[英]Can't run a bash script from docker-compose command in mongodb container
我試圖在啟動時在 mongo 數據庫容器中運行 bash 腳本,所以我有一個腳本文件,我將腳本文件的位置放在我的 docker-compose 的命令參數中,如下所示:
mongo1:
container_name: mongo1
image: mongo:4.4
volumes:
- ~/mongors/data1:/data/db
- ./rs-init.sh:/scripts/rs-init.sh
networks:
- mongors-network
ports:
- 27021:27017
links:
- mongo2
- mongo3
restart: always
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
command: /scripts/rs-init.sh
但是當我執行 docker-compose 時,它說這個命令無效,然后給我 mongodb 命令的所有選項:
Invalid command: /scripts/rs-init.sh
Options:
--networkMessageCompressors arg (=snappy,zstd,zlib)
Comma-separated list of compressors to
use for network messages
General options:
-h [ --help ] Show this usage information
--version Show version information
-f [ --config ] arg Configuration file specifying
我如何在啟動時在容器中運行這個 bash 腳本?
要理解錯誤,您需要了解command
和entrypoint
之間的關系: command
的值作為參數提供給entrypoint
中定義的任何內容,因此給出:
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
command: /scripts/rs-init.sh
您正在嘗試運行命令行:
/usr/bin/mongod --bind_ip_all --replSet dbrs /scripts/rs-init.sh
...這沒有任何意義; /scripts/rs-init.sh
不是mongod
命令的有效參數。
正如 @Turing85 在評論中指出的那樣,在這種情況下正確的解決方案是利用mongo
容器中內置的行為:它在/docker-entrypoint-initdb.d
中查找初始化文件。 為此,您不需要在docker-compose.yaml
中指定您自己的entrypoint
點(因為這樣做會覆蓋ENTRYPOINT
到容器映像中的入口點):
mongo1:
container_name: mongo1
image: mongo:4.4
volumes:
- ~/mongors/data1:/data/db
- ./rs-init.sh:/docker-entrypoint-initdb.d/rs-init.sh
networks:
- mongors-network
ports:
- 27021:27017
restart: always
與您的問題無關:您還應該從docker-compose.yaml
文件中刪除links
部分; links
的使用已被棄用多年(因為它在其中一個鏈接容器重新啟動的情況下很脆弱); 您可以僅按名稱引用撰寫文件中的其他容器。
當您在同一個容器運行中有一個ENTRYPOINT
和一個CMD
時,CMD 作為參數傳遞給 ENTRYPOINT,您最終只會執行一個組合命令。 在你的情況下,命令最終是
/usr/bin/mongod --bind_ip_all --replSet dbrs /scripts/rs-init.sh
Mongo 抱怨它不理解最后一個參數。
相反,您可以將入口點更改為 shell 並通過將它們與&&
連接來運行您想要的 2 個命令,如下所示
entrypoint: ["/bin/bash"]
command: -c '/scripts/rs-init.sh && docker-entrypoint.sh mongod'
我選擇使用“正常”啟動腳本啟動 Mongo。 如果您更喜歡現有的方式 ( /usr/bin/mongod --bind_ip_all --replSet dbrs
),您應該可以改用它。
請注意,只有當您希望腳本在每次啟動容器時都運行時才應執行此操作。 如果您希望腳本僅在您初始化新數據庫時運行(即/data/db
卷裝載為空),那么您應該使用 /docker-entrypoint-initdb.d 目錄作為 @Turing85 和 @larsks 建議. 但是當我閱讀你的帖子時,你每次都想運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.