web-dev-qa-db-fra.com

pourquoi docker ne trouve-t-il pas mon propre package lors du déploiement via serverless?

Je souhaite déployer mon package python sur Amazon et le rendre disponible via lambda. Pour cela, j'essaie sans serveur.

Lorsque j'essaie de déployer mon paquet, le message d'erreur suivant s'affiche:

SLS_DEBUG=* serverless deploy --stage dev --aws-profile default
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command create
Serverless: Load command install
Serverless: Load command package
Serverless: Load command deploy
Serverless: Load command deploy:function
Serverless: Load command deploy:list
Serverless: Load command deploy:list:functions
Serverless: Load command invoke
Serverless: Load command invoke:local
Serverless: Load command info
Serverless: Load command logs
Serverless: Load command login
Serverless: Load command logout
Serverless: Load command metrics
Serverless: Load command print
Serverless: Load command remove
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command slstats
Serverless: Load command plugin
Serverless: Load command plugin
Serverless: Load command plugin:install
Serverless: Load command plugin
Serverless: Load command plugin:uninstall
Serverless: Load command plugin
Serverless: Load command plugin:list
Serverless: Load command plugin
Serverless: Load command plugin:search
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command requirements
Serverless: Load command requirements:clean
Serverless: Load command requirements:install
Serverless: Load command requirements:cleanCache
Serverless: Invoke deploy
Serverless: Invoke package
Serverless: Invoke aws:common:validate
Serverless: Invoke aws:common:cleanupTempDir
Serverless: Generated requirements from /home/ola/projects/lambda/tagdoc/requirements.txt in /home/ola/projects/lambda/tagdoc/.serverless/requirements.txt...
Serverless: Installing requirements from /home/ola/projects/lambda/tagdoc/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.6
Requirement 'pkgg-0.1.0.tar.gz' looks like a filename, but the file does not exist
Processing ./pkgg-0.1.0.tar.gz
Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: '/var/task/pkgg-0.1.0.tar.gz'


  Error --------------------------------------------------

  null

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Stack Trace --------------------------------------------

Error: null
    at installRequirements (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:262:11)
    at installRequirementsIfNeeded (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:448:3)
    at ServerlessPythonRequirements.installAllRequirements (/home/ola/projects/lambda/tagdoc/node_modules/serverless-python-requirements/lib/pip.js:527:29)
From previous event:
    at PluginManager.invoke (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:22)
    at PluginManager.spawn (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:408:17)
    at Deploy.BbPromise.bind.then.then (/usr/lib/node_modules/serverless/lib/plugins/deploy/deploy.js:123:50)
From previous event:
    at Object.before:deploy:deploy [as hook] (/usr/lib/node_modules/serverless/lib/plugins/deploy/deploy.js:113:10)
    at BbPromise.reduce (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:55)
From previous event:
    at PluginManager.invoke (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:390:22)
    at PluginManager.run (/usr/lib/node_modules/serverless/lib/classes/PluginManager.js:421:17)
    at variables.populateService.then.then (/usr/lib/node_modules/serverless/lib/Serverless.js:157:33)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)
From previous event:
    at Serverless.run (/usr/lib/node_modules/serverless/lib/Serverless.js:144:8)
    at serverless.init.then (/usr/lib/node_modules/serverless/bin/serverless:43:50)
    at <anonymous>

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information -----------------------------
     OS:                     linux
     Node Version:           8.15.0
     Serverless Version:     1.30.1

mon fichier serverless.yml ressemble à ceci:

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!

service: tagdoc # NOTE: update this with your service name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"

provider:
  name: aws
  runtime: python3.6
  region: eu-central-1
# you can overwrite defaults here
#  stage: dev

plugins:
  - serverless-python-requirements

# You need to have Docker installed to be able to set dockerizePip:
# true or dockerizePip: non-linux. Alternatively, you can set
# dockerizePip: false, and it will not use Docker packaging. But,
# Docker packaging is essential if you need to build native packages
# that are part of your dependencies like Psycopg2, NumPy, Pandas, etc
custom:
  pythonRequirements:
    dockerizePip: true

# you can define service wide environment variables here
#  environment:
#    variable1: value1

# you can add packaging information here
package:
  include:
    - ./nltk_data/*

functions:
  ttxt:
    handler: handler.ttxt
    events:
      - http:
          path: /ttxt
          method: get
          integration: lambda
          request:
            template:
              application/json: '{ "txt" : "$input.params(''txt'')" }'
          response:
            headers:
  turl:
    handler: handler.turl
    events:
      - http:
          path: /turl
          method: get
          integration: lambda
          request:
            template:
              application/json: '{ "url" : "$input.params(''url'')" }'
          response:
            headers:
              Content-Type: "'application/json'"

et de haut le répertoire comprend tous les fichiers requis, en particulier le paquetage python construit:

tree -L 2 lambda/
lambda/
└── tagdoc
    ├── pkgg-0.1.0.tar.gz
    ├── handler.py
    ├── nltk_data
    ├── node_modules
    ├── package.json
    ├── package-lock.json
    ├── README.md
    ├── requirements.txt
    ├── serverless.yml
    └── srv

4 directories, 8 files

J'utilise actuellement Debian 9.5. J'ai également partagé le code avec un ami utilisant le même système d'exploitation via Github et il semble qu'il puisse déployer le package. Par conséquent, il semble que cela a à voir avec ma configuration locale de serverless/docker. Mais je n'arrive pas à comprendre comment résoudre ce problème. Toute aide sera grandement appréciée.

Exigences.txt ne contient qu'une ligne:

cat requirements.txt 
pkgg-0.1.0.tar.gz

Maintenant, le paquet lui-même a une certaine dépendance. En n'incluant que le package, il prend les dépendances dans le fichier setup.py du package.

MODIFIER

comme demandé dans l'un des commentaires. C'est mon .gitignore

#Compiled source#
#################
*.pyc

# no data files #
################
*.csv

#Log files#
#################
*.log

#swap files#
###############
*.swp
*.*~
\#*\#
.\#*

#Django migration directory#
############################
venv*
srv*
theme
collectedstatic
stunnel

# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml

#Serverless package
.serverless

et voici à quoi ressemble mon .serverless. Tous les exigences.txt ont exactement le même contenu que celui ci-dessus.

tree -L 3 .serverless/
.serverless/
├── cloudformation-template-create-stack.json
├── requirements
│   └── requirements.txt
└── requirements.txt

1 directory, 3 files
9
math

Le problème semble être dans serverless-python-requirements. Comme cela semble être le cas avec la version 4.1.1, cela fonctionne parfaitement, alors que ce n'est pas le cas avec 4.2.5. J'ai soulevé une question sur github

4
math

dockerizePip: true => pip sera exécuté dans le conteneur, qui ne partage pas le système de fichiers avec votre système d'exploitation hôte par défaut, mais il peut télécharger des packages python depuis Internet. Il semble que le plugin serverless-python-requirements ne monte pas correctement vos fichiers locaux sur le conteneur. Par conséquent, pip ne peut pas voir votre paquet local (pkgg-0.1.0.tar.gz).

IMHO la meilleure solution est de ne pas utiliser les fichiers locaux dans le requirements.txt.

Références croisées: https://github.com/UnitedIncome/serverless-python-requirements/issues/258

0
Jan Garaj

Envisagez de créer un conteneur Docker comme décrit dans cet article sans serveur blog post

0
carlsborg

Projet lambci/lambda se décrit comme étant Images that (very closely) mimic the live AWS Lambda environment; si vous voulez vous assurer que les environnements sont compatibles à 100%, créez une petite instance t2.micro sur EC2, connectez-vous via SSH et configurez votre projet à cet emplacement, exécutez pip install -r requirements.txt sur votre shell , téléchargez toutes les bibliothèques et supprimez l’instance. C'est exactement ce que Lambda fera la prochaine fois qu'il fournira l'environnement pour exécuter votre code.

0
Oscar Nevarez