DockerホストVMのプロバイダーとしてVirtualBoxを備えたWindows 7マシンでvagrantとdockerを使用しています。コンテナーを開始するdocker
ように、プロバイダーで定義された vagrant プロジェクトがあります。docker ホスト VM でコンテナーをプロビジョニングしていません。vagrant up
mongo
mongo
mongo
postgres
このmongo
場合、この実行中のmongo
コンテナーに対していくつかの mongo コレクション初期化スクリプトを実行して、vagrant を使用してインデックスなどを設定しようとしています。mongo
イメージは 以外のものを実行せず、コンテナーも同様であるmongod
ため、プロビジョナーを使用してこれらの操作を実行することはできません。has_ssh
false
実行中のコンテナにリンクされた別のコンテナでmongoシェルを実行しようとしましたが、それが機能するには、コマンドがコンテナで実行されるときに環境変数(および)mongodb
を展開できる必要があります。mongo
MONGO_PORT_27017_TCP_ADDR
MONGO_PORT_27017_TCP_PORT
を使用してこれを実行しようとしましたがvagrant docker-run
、これらの環境変数が正しく展開されるようにコマンドを適切に解釈する方法が見つかりません。試行するたびにmongo
、ホストとポートが提供されていないというコマンドのエラーが発生しました (環境変数が空に展開されます)。
私が最終的にできるようにしたいのは:
- 実行中の mongo コンテナーにリンクされたコンテナーを開始します (環境変数を取得します)
- やりたいmongoの初期化を含むJavaScriptファイルを新しいコンテナにアップロードします
- 次のようにコンテナでシェル コマンドを実行します。
mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_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
ソース
ドッカーホスト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
mongod
コンテナVagrantfile
: _
# -*- 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
mongo shell
コンテナーVagrantfile
(これは、コンテナーにリンクされた mongo 環境変数が正しく展開されるようにコマンドを実行しようとしてvagrant docker-run
いるmongod
コンテナーです):
# -*- 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