Ошибка Python только в среде докера (имя или служба неизвестна) - PullRequest
2 голосов
/ 16 октября 2019

Я запускаю скрипт python в контейнере Docker, который должен отправить мне электронное письмо с его результатами.

На локальном компьютере без среды Docker это работает, но в контейнере это дает мне это:

grab_immo    | Traceback (most recent call last):
grab_immo    |   File "./main.py", line 236, in <module>
grab_immo    |     main()
grab_immo    |   File "./main.py", line 229, in main
grab_immo    |     sendmail(item['link'], item['price'], item['titel'], item['description'])
grab_immo    |   File "./main.py", line 76, in sendmail
grab_immo    |     s = smtplib.SMTP(host=SMTP_HOST, port=SMTP_PORT)
grab_immo    |   File "/usr/local/lib/python3.7/smtplib.py", line 251, in __init__
grab_immo    |     (code, msg) = self.connect(host, port)
grab_immo    |   File "/usr/local/lib/python3.7/smtplib.py", line 336, in connect
grab_immo    |     self.sock = self._get_socket(host, port, self.timeout)
grab_immo    |   File "/usr/local/lib/python3.7/smtplib.py", line 307, in _get_socket
grab_immo    |     self.source_address)
grab_immo    |   File "/usr/local/lib/python3.7/socket.py", line 707, in create_connection
grab_immo    |     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
grab_immo    |   File "/usr/local/lib/python3.7/socket.py", line 748, in getaddrinfo
grab_immo    |     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
grab_immo    | socket.gaierror: [Errno -2] Name or service not known
grab_immo exited with code 0

часть, вызывающая ошибку:

def sendmail(link, price, titel, description):
    logger.info('Attempt to send mails with object %s', link)
    names, emails = get_contacts(newPath + 'contacts') # read contacts
    message_template = read_template(newPath + 'template')

    # set up the SMTP server
    s = smtplib.SMTP(host=SMTP_HOST, port=SMTP_PORT)
    s.starttls()
    s.login(MY_ADDRESS, PASSWORD)

    # For each contact, send the email:
    for name, email in zip(names, emails):
        msg = MIMEMultipart()       # create a message

        # add in the actual person name to the message template
        message = message_template.substitute(PERSON_NAME=name.title(), LINK=link, PRICE=price, TITEL=titel, DESCRIPTION=description)

        # setup the parameters of the message
        msg['From']=MY_ADDRESS
        msg['To']=email
        msg['Subject']="yyy"

        # add in the message body
        msg.attach(MIMEText(message, 'plain'))

        # send the message via the server set up earlier.
        s.send_message(msg)
        del msg
        logger.info('Mail sent to  %s', name)

    # Terminate the SMTP session and close the connection
    s.quit()

ENV part:

MY_ADDRESS = os.environ['MY_ADDRESS']
PASSWORD = os.environ['PASSWORD']
SMTP_HOST = os.environ['SMTP_HOST']
SMTP_PORT = os.environ['SMTP_PORT']

У меня раньше была другая проблема, но я не думаю,это связано

Спасибо за чтение!

edit: docker-compose part

environment:
    - MY_ADDRESS = yyy@yyy.com
    - PASSWORD = yyy
    - SMTP_HOST = smtp.strato.de
    - SMTP_PORT = 587

взято из здесь

dockerfile:

FROM python:3

COPY grab_immo /grab_immo

RUN mkdir /data

ADD ./data/contacts /data
ADD ./data/run.log /data
ADD ./data/template /data

VOLUME /data

WORKDIR /grab_immo

RUN pip install -r requirements.txt

ENV MY_ADDRESS=value \
    PASSWORD=value \
    SMTP_HOST=value \
    SMTP_PORT=587

CMD [ "python", "./main.py" ]

docker-compose.yml

---
version: "2"
services:
  grab_immo:
    build: .
    image: yyy/grab_immo
    container_name: grab_immo
    environment:
    - MY_ADDRESS = 'stuff'
    - PASSWORD = stuff
    - SMTP_HOST = smtp.strato.de
    - SMTP_PORT = 587
    volumes:
      - /home/yyy/grab_immo_config:/data
    restart: unless-stopped

1 Ответ

0 голосов
/ 17 октября 2019

проблема в том, что вы не получаете значения из ENV, которые вы предоставляете, попробуйте это:

import os
host = os.environ['SMTP_HOST']
port = os.environ['SMTP_PORT']
s = smtplib.SMTP(host=host, port=port)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...