これが、VPN(エンタープライズプライベートDB)内にあるMongoDBに接続する必要があるため、コンテナーのネットワークをコンテナー化しないようにDockerに指示する必要があります。
まさにそれを実行させてくれるDockerコマンドがあります:--net=Host
。参照 ここ 。
したがって、たとえば、ローカルマシンでコンテナを実行する場合は、次のようにします。
docker run --rm -it --net=Host [image-name]:[version] bash -il
そして、そのコマンドでうまくいきます。そのおかげで、「プライベート」なMongoDBに接続できます。
だから、私の質問は:ElasticBeanstalkでシングルDocker環境のdocker run
コマンドをカスタマイズして、--net=Host
を追加できるようにする方法はありますか?
container_commands をconfig.yml
ファイルに使用してその命令を追加しようとしましたが、必要なことを実行できないと思います。ここにスニペットがあります。
container_commands:
00-test_command:
command: bundle exec thin --net=Host
01-networking-fix:
command: "docker run --rm -it --net=Host [image-name]:[version] bash -il"
私は2つのコンテナコマンドでそれを修正することになりました
container_commands:
00_fix_networking:
command: sed -i 's/docker run -d/docker run --net=Host -d/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
01_fix_docker_ip:
command: sed -i 's/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
更新:Upstartスクリプトも修正する必要がありました。残念ながら、docker run
コマンドを変更する必要がなくなったため、自分が行ったことを書き留めませんでした。 (私が思うに)/etc/init/docker
に対してfiles
ディレクティブを実行します。 AWSは、そのファイルの01flip.sh
と同じ方法でNginx設定を編集します。
説明:
64bit Amazon Linux 2015.03 v2.0.2 running Docker 1.7.1
プラットフォームバージョンでは、編集する必要のあるファイルは/opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
です。このファイルは現在、Samarのバージョンよりもはるかに複雑であるため、実際の内容をそこに入れたくありませんでした。ただし、変更は基本的に同じです。で始まる行があります
docker run -d
コンテナコマンドで修正しました:
container_commands:
00_fix_networking:
command: sed -i 's/docker run -d/docker run --net=Host -d/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
これにより、--net=Host
引数が正常に追加されますが、別の問題が発生します。システムは無効なNginxディレクティブで終了します。 --net=Host
を使用するということは、docker inspect <container id>
を実行すると、NetworkSettingsにIPアドレスがないことを意味します。 AWSはこれを使用してNginxのサーバーディレクティブを作成し、最終的にserver :<some port you chose>
を生成します(--net=Host
を追加する前はserver <ip>:<port>
のようになります)。私もそのファイルにパッチを当てる必要がありました。 /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
で生成されます。
01_fix_docker_ip:
command: sed -i 's/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh
Elastic Beanstalkは通常、標準の構成セットで動作するアプリケーションに適していますが、AWSがEBスタックに提供する更新と一緒にカスタマイズして更新を維持することは困難です。そうは言っても、私は以下のようなことをしました。これは少しハックですが、うまく機能します。
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh":
mode: "000755"
owner: root
group: root
encoding: plain
content: |
#script content of original 04run.sh along with modification on docker run cmd
# eg. I injected multi-ports here
docker run -d \
"${EB_CONFIG_DOCKER_ENV_ARGS[@]}" \
"${EB_CONFIG_DOCKER_VOLUME_MOUNTS[@]}" \
"${EB_CONFIG_DOCKER_ENTRYPOINT_ARGS[@]}" \
"${PORT_ARGS[@]}" \
$EB_CONFIG_DOCKER_IMAGE_STAGING \
"${EB_CONFIG_DOCKER_COMMAND_ARGS[@]}" 2>&1 | tee /tmp/docker_run.log | tee $EB_CONFIG_DOCKER_STAGING_APP_FILE
これはあまりきちんとしたものではありません。少なくとも、エラスティックビーンズトークのアップデートで壊れないようにする必要があります。上記のものはdocker1.5スタック用ですが、実行しているバージョンと同様のことを行うことができます。
AWSスタックの最新バージョン(Docker 1.7.1を使用)では、デプロイ前のセットアップが少し異なりますであることに注意してください。次の場所にあるファイルを更新する必要があります:/opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
commands:
00001_add_privileged:
cwd: /tmp
command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'
または、たとえば、Dockerイメージに引数を渡したい場合:
commands:
00001_modify_docker_run:
cwd: /tmp
command: 'sed -i "s/\$EB_CONFIG_DOCKER_IMAGE_STAGING/\$EB_CONFIG_DOCKER_IMAGE_STAGING -gzip -enable-url-source/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'