Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何使用vagrant docker run和容器环境变量展开_Mongodb_Docker_Vagrant_Vagrant Windows - Fatal编程技术网

Mongodb 如何使用vagrant docker run和容器环境变量展开

Mongodb 如何使用vagrant docker run和容器环境变量展开,mongodb,docker,vagrant,vagrant-windows,Mongodb,Docker,Vagrant,Vagrant Windows,我在Windows7机器上使用vagrant和docker,并使用VirtualBox作为docker主机VM的提供者。我使用docker提供程序定义了一个vagrant项目,这样vagrant up将启动mongo容器。我没有在docker主机VM中设置mongo容器,因为我有时需要mongo,有时需要postgres,等等 对于mongo案例,我试图针对这个正在运行的mongo容器运行一些mongo集合初始化脚本,以使用vagrant设置索引等。mongo映像只运行mongod,因此对容器的

我在Windows7机器上使用vagrant和docker,并使用VirtualBox作为docker主机VM的提供者。我使用
docker
提供程序定义了一个vagrant项目,这样
vagrant up
将启动
mongo
容器。我没有在docker主机VM中设置
mongo
容器,因为我有时需要
mongo
,有时需要
postgres
,等等

对于
mongo
案例,我试图针对这个正在运行的
mongo
容器运行一些mongo集合初始化脚本,以使用vagrant设置索引等。
mongo
映像只运行
mongod
,因此
对容器的ssh
false
,因此使用供应器来运行这些操作不是一个选项

我尝试在一个单独的容器中运行mongo shell,该容器链接到运行
mongodb
的容器,但为了实现这一点,我需要能够在容器中运行命令时扩展
mongo
环境变量(
mongo\u PORT\u 27017\u TCP\u ADDR
mongo\u PORT\u 27017\u TCP\u PORT

我一直在尝试使用
vagrant docker run
来执行此操作,但我找不到一种方法来正确解释命令,从而正确扩展这些环境变量。每次尝试都会导致
mongo
命令抱怨未提供主机和端口(环境变量扩展为空)

我最终希望能够做到的是:

  • 启动一个链接到正在运行的mongo容器的容器(这样它就可以获取其环境变量)
  • 将一个javascript文件上载到新容器中,其中包含我想要执行的mongo初始化
  • 在容器上运行shell命令,如下所示:
  • mongo“$mongo\u PORT\u 27017\u TCP\u ADDR:$mongo\u PORT\u 27017\u TCP\u PORT/db name”initialize.js

  • 卸下容器
  • 有什么建议或其他方法可以尝试吗

    典型失败命令的示例 Powershell是此Windows系统上的命令行解释器:

    PS C:\Users\hoobajoob\Documents\Eclipse\workspace-sts-luna\project\.environment\vagrant\mongo-provisioner> vagrant docker-run default -- mongo
     '$MONGO_PORT_27017_TCP_ADDR:`$MONGO_PORT_27017_TCP_PORT/test' --eval "printjson(db.getCollectionNames())"
    ==> default: Docker host is required. One will be created if necessary...
        default: Docker host VM is already ready.
    ==> default: Creating the container...
        default:   Name: mongo-provisioner_default_1449193166_1449193166
        default:  Image: mongo
        default:    Cmd: mongo $MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test
        default:   Link: mongo-container:mongo
        default:
    
        default: Container is starting. Output will stream in below...
        default:
        default: MongoDB shell version: 3.0.7
        default: 2015-12-04T01:38:20.037+0000 E QUERY    Error: Missing host name in connection string ":/test"
        default:     at Error (<anonymous>)
        default:     at connect (src/mongo/shell/mongo.js:160:15)
        default:     at (connect):1:6 at src/mongo/shell/mongo.js:160
        default: exception:
        default: connect failed
        default:
    A Docker command executed by Vagrant didn't complete successfully!
    The command run along with the output from the command is shown
    below.
    
    Command: "docker" "run" "--name" "mongo-provisioner_default_1449193166_1449193166" "--link" "mongo-container:mongo" "--rm=true" "mongo" "mongo" "$MONGO_POR
    T_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test" "--eval" "printjson(db.getCollectionNames())"
    
    Stderr: exception: connect failed
    
    Stdout: MongoDB shell version: 3.0.7
    2015-12-04T01:38:20.037+0000 E QUERY    Error: Missing host name in connection string ":/test"
        at Error (<anonymous>)
        at connect (src/mongo/shell/mongo.js:160:15)
        at (connect):1:6 at src/mongo/shell/mongo.js:160
    
    mongod
    容器
    Vagrantfile

    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.require_version ">= 1.6.0"
    VAGRANTFILE_API_VERSION = "2"
    
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.hostname = "docker-host"
      config.vm.box_check_update = false
      config.ssh.insert_key = false
      config.vm.box = "williamyeh/ubuntu-trusty64-docker"
      config.vm.network "forwarded_port", guest: 27017, host: 27017
      config.vm.synced_folder ".", "/vagrant", disabled: true
    end
    
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.require_version ">= 1.6.0"
    VAGRANTFILE_API_VERSION = "2"
    ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
    
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.synced_folder ".", "/vagrant", disabled: true
      config.vm.provider "docker" do |docker|
        docker.vagrant_vagrantfile = "../docker-host/Vagrantfile"
        docker.image = "mongo"
        docker.ports = ['27017:27017']
        docker.name = 'mongo-container'
      end
    end
    
    mongoshell
    container
    Vagrantfile
    (这是我试图运行
    vagrant docker run
    命令的容器,以便链接到
    mongod
    容器的mongo环境变量正确展开):


    目前,我发现Vagrant的docker provider在我可以使用它执行的docker容器操作范围方面相当有限

    我研究了在mongo容器内运行
    ssh
    ,这将允许我在
    mongo
    容器上运行Vagrant的Provisioniers,以便让这些脚本以这种方式运行。但是,这需要a)定义自定义映像并重新处理入口点,以便启动
    ssh
    mongod
    ,以及b)在docker提供程序
    Vagrantfile
    中设置
    的ssh=true

    不幸的是,这个选项对当前版本的vagrant不起作用,当我运行
    vagrant up
    时,如果我在docker提供者
    vagrant文件中设置
    的ssh
    true
    ,它就会挂在我的Windows系统上

    所以,对于这个流浪的新手来说,我的选择似乎是有限的

    我目前认为一个更好的方法可能是完全停止使用docker provider
    Vagrantfile
    项目,而是在一个docker主机
    Vagrantfile
    中定义一组不同的供应器

    然后,如果我想启动一个特定的容器,我可以定义并运行一个只运行该容器的provisioner(不执行任何mongo初始化)。如果我想运行这些mongo初始化脚本,那么我有一个单独的provisioner来执行这些操作,依此类推

    拆下容器需要使用相应的
    docker rm
    命令运行
    vagrant ssh

    这似乎是一种耻辱,但我没有太多的运气尝试通过
    流浪码头运行
    初始化mongo

    更新:12/4/2015 我完全放弃了使用Vagrant的docker provider,主要原因是,至少在我的案例中,我发现docker provider在其支持的docker词汇表中过于有限,无法满足我的需求。这个结论是有条件的,因为我不是流浪汉或码头工人的老手,所以我完全有可能错过了什么

    因此,例如,为了初始化mongo数据库,我更希望能够使用相同的javascript初始化文件来初始化mongo数据库,这些文件可能由目标站点的
    mongoDB
    管理员运行,这些文件来自开发源代码树。构建一个定制的docker mongo容器预先配置了这些文件,这样的开销太大了

    至少据我所知,这种不寻常的方式是使用
    文件
    供应器将该文件复制到正在运行的容器中,并使用
    脚本
    供应器在容器上执行该文件。Vagrant的
    文件
    脚本
    供应器需要在容器上使用SSH才能工作

    但是,出于许多原因,docker land似乎不在容器中运行SSH,所以如果不需要的话,我宁愿不这样做

    在不创建使用这些文件预配置的自定义容器的情况下,docker实现这一点的(或一种)方法是使用
    docker cp
    docker exec
    ,以便在运行的容器上实现这一点。这些都不是由Vagrant的docker provider命令显示的,所以我不知道如何通过docker provider到达那里

    所以,我相信这是完全合理的,
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    # Specify Vagrant version and Vagrant API version
    Vagrant.require_version ">= 1.6.0"
    VAGRANTFILE_API_VERSION = "2"
    ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
    
    # Create and configure the Docker container(s)
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.synced_folder ".", "/vagrant", disabled: true
      config.vm.provider "docker" do |docker|
        docker.vagrant_vagrantfile = "../docker-host/Vagrantfile"
        docker.image = "mongo"
        docker.link("mongo-container:mongo")
      end
    end
    
    # provisioners
      config.vm.provision "host.provision.scripts.mongo", type: "file", source: $mongoProvisionInit, destination: $hostProvisionMongoInit
      config.vm.provision "mongo.run", type: "shell", inline: $dockerRun_mongo
      config.vm.provision "mongo.provision.scripts", type: "shell", inline: $dockerCp_MongoInit
      config.vm.provision "mongo.db.init", type: "shell", inline: $dockerExec_mongoDbInit
      config.vm.provision "mongo.stop", type: "shell", inline: $dockerStop_mongo
      config.vm.provision "mongo.start", type: "shell", inline: $dockerStart_mongo
      config.vm.provision "mongo.restart", type: "shell", inline: $dockerRestart_mongo
      config.vm.provision "mongo.rm", type: "shell", inline: $dockerRm_mongo
    e
    
    $dockerRun_mongo = <<MONGO
    echo '>>> docker run --name mongo-container -p 27017:27017 -d mongo'
    docker run --name mongo-container -p 27017:27017 -d mongo
    MONGO
    
    $dockerCp_MongoInit = <<MONGO
    echo '>>> docker exec mongo-container mkdir /home/vagrant'
    docker exec mongo-container mkdir -p /home/vagrant
    echo '>>> docker cp ./provision/mongo/initialize.js mongo-container:/home/vagrant/mongo.initialize.js'
    docker cp ./provision/mongo/initialize.js mongo-container:/home/vagrant/mongo.initialize.js
    MONGO
    
    $dockerExec_mongoDbInit = <<MONGO
    echo '>>> docker exec mongo-container mongo mongo db-name /home/vagrant/mongo.initialize.js'
    docker exec mongo-container mongo db-name /home/vagrant/mongo.initialize.js
    MONGO
    
    $dockerStop_mongo = <<MONGO
    echo '>>> docker stop mongo-container'
    docker stop mongo-container
    MONGO