web-dev-qa-db-ja.com

Elastic Beanstalkでdockerrunコマンドをカスタマイズするにはどうすればよいですか?

これが、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_commandsconfig.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"
23
mayacr86

私は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
12
mqsoh

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スタック用ですが、実行しているバージョンと同様のことを行うことができます。

4
Samar

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'
2
Kyle Chadha