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]
ホスト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アドレスに設定します。 mailhub
をsmtp-server
などのシンボルに設定し、次に示すように--add-Host
オプションを使用してコンテナを実行できます Dockerfile (--add-Host smtp-server:your-docker0-address
)。これにより、実際にホストMTAを使用してメールを送信するコンテナーで使用可能なsendmailが構成されます。
ホストにメールサーバーがインストールおよび設定されていると仮定します!
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'
以前の回答に基づいて、
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を実行します。
/ 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/
最もエレガントなソリューションではありませんが、私は自分で方法を見つけました。ホストの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要求を中継します。
編集:詳細とメールフォワーダーの設定方法については、xuhdevの回答をご覧ください。私の答えを使用して、ホストで接尾辞の代わりにsendmailをセットアップできます。
編集#2:ドッカーからのSMTPトラフィックを許可するファイアウォールルールを追加
次のように、tarun mittalとして同様のセットアップを行いました。
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の再起動サービス
私もこの問題に苦労しました。 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]が役に立つ読み物であることがわかりました。
Set /etc/postfix/main.cfにある修正後の構成で、inet_interfacesをdockerブリッジ(docker0)にポイントする必要があります。
inet_interfaces =
ホストにインストールされたpostfixを介してdockerから電子メールを送信する
注:ifconfigコマンドを使用して、Dockerブリッジアドレスを取得します