Mongodb 如何使用vagrant docker run和容器环境变量展开
我在Windows7机器上使用vagrant和docker,并使用VirtualBox作为docker主机VM的提供者。我使用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,因此对容器的
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“$mongo\u PORT\u 27017\u TCP\u ADDR:$mongo\u PORT\u 27017\u TCP\u PORT/db name”initialize.js
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
containerVagrantfile
(这是我试图运行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 providerVagrantfile
项目,而是在一个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