簡體   English   中英

無法從 docker-compose 命令在 mongodb 容器中運行 bash 腳本

[英]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 腳本?

要理解錯誤,您需要了解commandentrypoint之間的關系: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM