Невозможно использовать CoinBase API в Docker-контейнере. - PullRequest
0 голосов
/ 26 апреля 2018

Я не понимаю, почему, когда я пытаюсь использовать мое приложение python coinbase в докер-контейнере, я всегда получаю coinbase.wallet.error.AuthenticationError: APIError(id=authentication_error): invalid api key

Я проверил, что мой ключ API правильный и присутствует событиеесли я его распечатаю (в журнале докера)

Если запустить одно и то же приложение напрямую с оружейным оружием, оно будет работать как шарм.

Есть идеи, что здесь происходит?

Вот Dockerfile для приложения фляги

FROM python:3.5

ENV PYTHONUNBUFFERED 1
RUN mkdir -p /opt/services/flaskapp/src
# We copy the requirements.txt file first to avoid cache invalidations
COPY requirements.txt /opt/services/flaskapp/src/
COPY . /opt/services/flaskapp/src
WORKDIR /opt/services/flaskapp/src
RUN ls
RUN pip install -e .
RUN pip install -r requirements.txt
RUN pip install uwsgi
RUN myapp init
RUN tox
EXPOSE 5090
CMD ["gunicorn", "-b 0.0.0.0:5090", "myapp.wsgi:app"]

Вот Docker compose

version: '3.2'
services:
  db:
    image: "postgres:9.6.5"
    volumes:
      - "dbdata:/var/lib/postgresql/data"
    env_file:
      - ./myapp/.env
    networks:
      - traefik-net
  flaskapp:
    build: .
    env_file:
      - ./myapp/.env
    privileged: true
    volumes:
      - .:/opt/services/flaskapp/src
    networks:
      - traefik-net
    depends_on:
      - db
  nginx:
    image: "nginx:1.13.5"
    ports:
      - "4280:80"
    volumes:
      - ./conf.d:/etc/nginx/conf.d
    networks:
      - traefik-net
    depends_on: 
      - flaskapp
networks:
  traefik-net:
    driver: bridge
volumes:
  dbdata

Вот код приложения, который вызывает build_api_error

cb_helper = CoinbaseHelper(
    account,
    os.getenv("CB_API_KEY"),
    os.getenv("CB_API_SECRET")
)
print(os.getenv("CB_API_KEY"))
cb_wallet = cb_helper.create_address()

Результат

flaskapp_1  | Traceback (most recent call last):
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__
flaskapp_1  |     return self.wsgi_app(environ, start_response)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app
flaskapp_1  |     response = self.handle_exception(e)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask_restful/__init__.py", line 273, in error_router
flaskapp_1  |     return original_handler(e)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception
flaskapp_1  |     reraise(exc_type, exc_value, tb)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise
flaskapp_1  |     raise value.with_traceback(tb)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
flaskapp_1  |     response = self.full_dispatch_request()
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
flaskapp_1  |     rv = self.handle_user_exception(e)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask_restful/__init__.py", line 273, in error_router
flaskapp_1  |     return original_handler(e)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
flaskapp_1  |     reraise(exc_type, exc_value, tb)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/_compat.py", line 32, in reraise
flaskapp_1  |     raise value.with_traceback(tb)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
flaskapp_1  |     rv = self.dispatch_request()
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
flaskapp_1  |     return self.view_functions[rule.endpoint](**req.view_args)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask_restful/__init__.py", line 480, in wrapper
flaskapp_1  |     resp = resource(*args, **kwargs)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask/views.py", line 84, in view
flaskapp_1  |     return self.dispatch_request(*args, **kwargs)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask_restful/__init__.py", line 595, in dispatch_request
flaskapp_1  |     resp = meth(*args, **kwargs)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/flask_jwt_extended/view_decorators.py", line 39, in wrapper
flaskapp_1  |     return fn(*args, **kwargs)
flaskapp_1  |   File "./myapp/api/resources/wallet.py", line 74, in post
flaskapp_1  |     cb_wallet = cb_helper.create_address()
flaskapp_1  |   File "./myapp/commons/coinbase.py", line 13, in create_address
flaskapp_1  |     adresse = self.client.create_address(self.account)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/coinbase/wallet/client.py", line 308, in create_address
flaskapp_1  |     response = self._post('v2', 'accounts', account_id, 'addresses', data=params)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/coinbase/wallet/client.py", line 132, in _post
flaskapp_1  |     return self._request('post', *args, **kwargs)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/coinbase/wallet/client.py", line 116, in _request
flaskapp_1  |     return self._handle_response(response)
flaskapp_1  |   File "/usr/local/lib/python3.5/site-packages/coinbase/wallet/client.py", line 125, in _handle_response
flaskapp_1  |     raise build_api_error(response)
flaskapp_1  | coinbase.wallet.error.AuthenticationError: APIError(id=authentication_error): invalid api key

Вот мой класс помощников по монетной базе

from coinbase.wallet.client import Client


    class CoinbaseHelper():
        """
        Helper to talk to coinbase API
        """
        def __init__(self, account, api_key, api_secret):
            self.client = Client(api_key, api_secret)
            self.account = account

        def create_address(self):
            adresse = self.client.create_address(self.account)
            return adresse

        def get_adresse(self, addr):
            address = self.client.get_address(self.account, addr)
            return address

        def get_accounts(self):
            accounts = self.client.get_accounts()
            return accounts
...