web-dev-qa-db-ja.com

Dockerコンテナー内でsendmailを構成する

docker container でphpとApacheを実行しています。ホストは、Dockerインスタンスが実行されているAWSインスタンスにあります。 Dockerターミナルからメールを送信できません。 Dockerのホストの構成を使用するsendmailを使用して、Dockerインスタンスから電子メールを送信する方法はありますか?

次のコマンドは、ホストからメールを送信しますが、Dockerインスタンスからはメールを送信しません。エラーも発生しません。

echo "Subject: Testing Email" | cat - text | /usr/lib/sendmail -F [email protected] -t [email protected]
23
tarun mittal

ホストMTAがdocker0でリッスンするように設定し、ssmtpをコンテナにインストールして、コンテナ内のsendmailをホストMTAとブリッジするようにします。ホストでMTAを実行する理由は、システム(クリティカル)エラーを管理者のメールボックスに送信できるためです。コンテナでMTAを実行しない理由は、ホストシステムが既にMTAを実行しているため、プロセスが重複しているためです。

ホストでは、接尾辞を使用しました。必要なことは、docker0でリッスンし、Dockerコンテナからの送信メールを受け入れるようにpostfixを設定することです。ファイル/etc/postfix/main.cfを編集し、docker0 IPアドレスをinet_interfacesに追加して、Dockerコンテナーからの接続を受け入れます。また、Dockerコンテナーのネットワークアドレスをmynetworksに追加して、Dockerコンテナーがホスト上のpostfixサーバー経由でメールを送信できるようにします。 ( 参照および詳細

コンテナでsendmailを使用するには、ssmtpをインストールし、FromLineOverrideを許可するように設定し、mailhub/etc/ssmtp/ssmtp.confのホストのIPアドレスに設定します。 mailhubsmtp-serverなどのシンボルに設定し、次に示すように--add-Hostオプションを使用してコンテナを実行できます Dockerfile--add-Host smtp-server:your-docker0-address)。これにより、実際にホストMTAを使用してメールを送信するコンテナーで使用可能なsendmailが構成されます。

20
xuhdev

Dockerfileのどこにもsendmail(またはその他のメールエージェント)がインストールされていません。ただし、ホストは明らかにsendmailを利用できます。 「最良の」または最もDockerに近いソリューションは、MTAを実行する別のコンテナ( postfix または exim など)をスピンアップし、それを使用するようにアプリケーションを構成することです。

5
naneau

ホストにメールサーバーがインストールおよび設定されていると仮定します!

Alpineベースのdockerイメージには、sendmail実行可能ファイルが必要です。

簡単な解決策は、ホストのネットワーク上でコンテナを実行することです:

docker run --rm --net="Host" php:fpm-Alpine sh -c 'echo "Subject: test" | sendmail -v [email protected]'

デフォルトのネットワークブリッジでコンテナを実行するには、Dockerインターフェース172.17.0.1でリッスンするようにメールサーバーを構成し、Dockerサブネット172.17.0.0/16

影響を受けるEximオプション:/ etc/exim4/update-exim4.conf.conf

dc_local_interfaces='127.0.0.1 ; ::1 ; 172.17.0.1'
dc_relay_nets='172.17.0.0/16'

メールサーバーを再起動し、コンテナの詳細を実行します:)

docker run --rm --hostname="your-domain.com" php:fpm-Alpine sh -c 'echo "Subject: test" | sendmail -v [email protected] -S 172.17.0.1'
5
Igor Sukharev

以前の回答に基づいて、
config/sendmail_config.shを作成します:

#!/bin/sh
# set Host in hosts
line=$(head -n 1 /etc/hosts)
line2=$(echo $line | awk '{print $2}')
echo "$line $line2.localdomain" >> /etc/hosts

yum install -y sendmail sendmail-cf m4 \
    && hostname >> /etc/mail/relay-domains \
    && m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

#remove localhost limit
sed -i -e "s/Port=smtp,Addr=127.0.0.1, Name=MTA/Port=smtp, Name=MTA/g" \
    /etc/mail/sendmail.mc
sendmail -bd

Debianベースのコンテナーでapt-getのyumを変更

次に、Dockerfileに以下を追加します。

RUN sed -i -e "s#;sendmail_path =#sendmail_path = /usr/sbin/sendmail -t -i#g"  \
    /your_path_to/php.ini
COPY ./config/sendmail_config.sh .

Php utilを使用してsendmailが欲しいので、タスクを完了するために別のMTAコンテナまたはホストにリンクしなくても、どこでも使用できます。
sh sendmail_config.shを実行してから、php utilを実行します。

5
stuartz

/ etc/hostsのDockerホスト名に完全修飾ドメイン名を追加すると、私にとってはうまくいきません。

{YourDockerIP} {YouDockerHostName}.localdomain {YouDockerHostName}

私には次のように見えます:

172.17.0.25 77f5a7ae8606.localdomain 77f5a7ae8606

このbashスクリプトを使用して、この行を自動的に更新することもできます。

#!/bin/bash
line=$(head -n 1 /etc/hosts | awk '{printf "%s %s.localdomain %s", $1, $2, $2}')
sed -e "1 s/^.*$/${line}/g" /etc/hosts > hosts
# with sed -i, it actually performs a rename of /etc/hosts, but docker does not
# allow that, so we have to use a temp file and copy it to overwrite /etc/hosts
cp hosts /etc/hosts
rm hosts

参照: http://hjk41.azurewebsites.net/2015/09/25/using-sendmail-inside-docker/

3
hjk41

最もエレガントなソリューションではありませんが、私は自分で方法を見つけました。ホストのIPを介してリクエストを中継するように、ドッカー内でsendmailを設定しました。次の行をファイル「/ etc/mail/access」に追加します

Connect:<Host_ip_here>          RELAY

また、ホストおよびdockerで、ファイル「/etc/mail/sendmail.mc」内の次の行を「dnl#」でプレフィックスし、「dnl」でサフィックスを付けてコメントアウトします。

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')

ホストIPを環境変数としてdockerコンテナーに渡し、構成可能にしました。これで、Dockerのsendmailは、ホストマシンを介してsendmailのsmtp要求を中継します。

3
tarun mittal

編集:詳細とメールフォワーダーの設定方法については、xuhdevの回答をご覧ください。私の答えを使用して、ホストで接尾辞の代わりにsendmailをセットアップできます。

編集#2:ドッカーからのSMTPトラフィックを許可するファイアウォールルールを追加

次のように、tarun mittalとして同様のセットアップを行いました。

  • dockerアプリでは、smtpサーバーをdocker0インターフェイスのIP(172.17.42.1)で使用するように設定しました
  • dockerホストで、/ etc/mail/sendmail.mcを変更して、docker0インターフェイスでのリッスンを含めるようにしました(tarunの回答のすべてのインターフェイスとは対照的に、太字は行を追加します)

    DAEMON_OPTIONS( `Family = inet、Name = MTA-v4、Port = smtp、Addr = 127.0.0.1 ')dnl

    DAEMON_OPTIONS( `Family = inet、Name = MTA-v4、Port = smtp、Addr = 172.17.42.1 ')dnl

  • ファイアウォールiptablesのdockerコンテナーからdockerインターフェースへのアクセスを許可します-I INPUT -s 172.17.0.0/24 -d 172.17.42.1 -dport 25 -j ACCEPT

  • / etc/mail/accessに、すべてのdockerインスタンスが電子メールを送信できるように最後に追加しましたmakemap hash/etc/mail/access </ etc/mail/accessデータベースをコンパイルします

    ///編集済み-何度も再構築すると、DOCKERが172.17.1.Xに到達するため、以下で使用

    /// OLD-接続:172.17.0リレー

    接続:172.17リレー

  • 最後にsendmailを再起動する-sendmailの再起動サービス

1
zveljkovic

私もこの問題に苦労しました。 Dockerコンテナ内で実行されているpythonコードから、ホストマシンで実行されているpostfix(smtpサーバー)を使用して一時的に電子メールを送信する必要がありました。たくさんのことを試した後、単純なソリューションであることが判明したのは、-net = "Host"を指定したdocker runコマンドでした。注意:これは、コンテナーがネットワークスタックをdockerホストと共有し、コンテナーの観点からは、localhost(または127.0.0.1)がdockerホストを参照するため、すべての場合に適したソリューションではない場合があります。以下は、ubuntuホストで行ったことです。docker run -it --net = "Host" ubuntu/bin/bashこれにより、コンテナShellが作成されました。次に、このコンテナにpythonをインストールしました。apt-getupdate && apt-get -y install Supervisor python-pip

次に、pythonインタープリターを起動し、次のコード行を実行しました。

import smtplib
from email.mime.text import MIMEText

fromaddr = 'testemail.yourdomain.com'
toaddr = 'youremail.yourdomain.com'

msg = MIMEText('Sample email from python/docker container')
msg['from'] = fromaddr
msg['subject'] = 'Subject of python email'
msg['to'] = toaddr

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddr, msg.as_string())
server.quit

また、[この] [1]が役に立つ読み物であることがわかりました。

1
Dean Sha

Set /etc/postfix/main.cfにある修正後の構成で、inet_interfacesをdockerブリッジ(docker0)にポイントする必要があります。

inet_interfaces =

ホストにインストールされたpostfixを介してdockerから電子メールを送信する

注:ifconfigコマンドを使用して、Dockerブリッジアドレスを取得します

0
Satish Gandham