代码之家  ›  专栏  ›  技术社区  ›  Victor Garbuz

容器启动后运行命令

  •  0
  • Victor Garbuz  · 技术社区  · 6 年前

    我正在尝试在Docker容器启动后执行命令。
    这是我的码头文件

    FROM mysite:myport/mongo:3.6
    EXPOSE 27017
    ADD mongo.js /data/mongodb/scripts/
    

    这是我的docker-compose.yml

    mongo:
        image: test-mongo
        container_name: test-mongo
        hostname: mongo
        expose:
          - "27017"
        ports:
          - "27017:27017"
        command: mongo --eval load("/data/mongodb/scripts/mongo.js")   
    

    docker compose——没有ansi up返回我

    Creating test-mongo ...
    Creating test-mongo ... done
    Attaching to test-mongo
    test-mongo | MongoDB shell version v3.6.5
    test-mongo | connecting to: mongodb://127.0.0.1:27017
    test-mongo | 2018-06-09T15:46:50.229+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), rea
    son: Connection refused
    test-mongo | 2018-06-09T15:46:50.229+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
    test-mongo | connect@src/mongo/shell/mongo.js:251:13
    test-mongo | @(connect):1:6
    test-mongo | exception: connect failed
    test-mongo exited with code 1
    

    我不知道如何加载我的文件 之后 MongoDB已启动

    2 回复  |  直到 5 年前
        1
  •  1
  •   larsks    6 年前

    通过 command 在你的 docker-compose.yaml ,你是 覆盖 的正常行为 mongo image——所以Mongo服务器永远不会启动。您通常处理此问题的方法是将脚本放入 第二 图像,然后启动第二个容器作为 docker-compose.yaml文档 这样就可以与Mongo服务器建立网络连接。比如:

    version: "3"
    
    services:
      mongo:
        image: mongo
    
      client:
        image: my-mongo-client
        restart: on-failure
        command: mongo --host mongo --eval load("/data/mongodb/scripts/mongo.js")
    

    这个 restart 指令将导致客户端容器重新启动 故障时自动启动,这是必要的,因为它可能会尝试 在Mongo服务器可以处理连接之前进行连接。

        2
  •  1
  •   Matt    5 年前

    如果您所要做的就是初始化一个新的数据库,例如创建一个新的模式并添加一个用户,那么您可以创建一个初始化脚本并将其加载到容器中。从码头枢纽 documentation 以下内容:

    当容器第一次启动时,它将执行扩展名为.sh和.js的文件,这些扩展名在/docker entrypoint initdb.d中找到。文件将按字母顺序执行。.js文件将由mongo使用mongo initdb_database变量指定的数据库(如果存在)执行,否则进行测试。您也可以在.js脚本中切换数据库。