【问题标题】:Docker-compose running local causes ModuleNotFoundError on remoteDocker-compose 在本地运行会导致远程 ModuleNotFoundError
【发布时间】:2019-08-18 20:43:11
【问题描述】:

我有以下几点:

Dockerfile

# Pull base image
FROM python:3.7.3-slim

# Set environement variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set working directory
WORKDIR /code/

# Update system
RUN apt update && apt-get -y update
RUN apt -y install mysql-client
RUN apt -y install python-dev
RUN apt -y install gcc
RUN apt -y install default-libmysqlclient-dev

# Install dependencies
RUN pip install pipenv
COPY Pipfile Pipfile.lock /code/
RUN pipenv install --system

# Copy project
COPY . /code/

# Port to expose
EXPOSE 8000

# Command to run the webserver
CMD ["gunicorn", "gotrakk.wsgi:application", "--bind",  "0.0.0.0:8000"]

docker-compose.prod.yml

version: '3.7'
services:
  web:
    build: .
    image: 734309331381.dkr.ecr.us-west-2.amazonaws.com/keeptrakk:latest
    command: gunicorn gotrakk.wsgi:application --bind 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - .:/code
    env_file:
      - environment.txt
    expose:
      - "8000"
  nginx:
    build: ./nginx
    image: 734309331381.dkr.ecr.us-west-2.amazonaws.com/nginx:latest
    ports:
      - 80:80
      - 443:443
    depends_on:
      - web

当我在本地运行时运行良好

$(aws ecr get-login --no-include-email --region us-west-2)
docker-compose -f docker-compose.prod.yml build
docker-compose -f docker-compose.prod.yml push
docker-compose -f docker-compose.prod.yml up

如果我登录到我的亚马逊机器并运行容器

eval $(docker-machine env keeptrakk)
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up

我收到以下ModuleNotFoundError

Recreating gotrakk_web_1 ... done
Recreating gotrakk_nginx_1 ... done
Attaching to gotrakk_web_1, gotrakk_nginx_1
web_1    | [2019-08-18 20:27:28 +0000] [1] [INFO] Starting gunicorn 19.9.0
web_1    | [2019-08-18 20:27:28 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
web_1    | [2019-08-18 20:27:28 +0000] [1] [INFO] Using worker: sync
web_1    | [2019-08-18 20:27:28 +0000] [8] [INFO] Booting worker with pid: 8
web_1    | [2019-08-18 20:27:28 +0000] [8] [ERROR] Exception in worker process
web_1    | Traceback (most recent call last):
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
web_1    |     worker.init_process()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 129, in init_process
web_1    |     self.load_wsgi()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
web_1    |     self.wsgi = self.app.wsgi()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
web_1    |     self.callable = self.load()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
web_1    |     return self.load_wsgiapp()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
web_1    |     return util.import_app(self.app_uri)
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 350, in import_app
web_1    |     __import__(module)
web_1    | ModuleNotFoundError: No module named 'gotrakk'
web_1    | [2019-08-18 20:27:28 +0000] [8] [INFO] Worker exiting (pid: 8)
web_1    | [2019-08-18 20:27:28 +0000] [1] [INFO] Shutting down: Master
web_1    | [2019-08-18 20:27:28 +0000] [1] [INFO] Reason: Worker failed to boot.
nginx_1  | 2019/08/18 20:27:29 [emerg] 1#1: host not found in upstream "web:8000" in /etc/nginx/conf.d/nginx.conf:2
nginx_1  | nginx: [emerg] host not found in upstream "web:8000" in /etc/nginx/conf.d/nginx.conf:2
gotrakk_web_1 exited with code 3

如果我直接在远程机器上运行keeptrakk:latest

docker run -it --env-file environment.txt -p 8000:8000 --name keeptrakk 734309331381.dkr.ecr.us-west-2.amazonaws.com/keeptrakk:latest

它也运行良好。

我怀疑我的 docker-compose 文件有问题,但我不明白为什么它在本地运行得很好。

【问题讨论】:

  • environment.txt 中有什么内容?
  • 基本上保存数据库密码和访问密钥。

标签: django docker-compose gunicorn docker-machine


【解决方案1】:

回答我自己的问题,以防其他人路过。

我将docker-compose.prod.yml 更改为以下内容:

version: '3.7'
services:
  web:
    build: .
    image: 734309331381.dkr.ecr.us-west-2.amazonaws.com/keeptrakk:latest
    command: gunicorn gotrakk.wsgi:application --bind 0.0.0.0:8000
    ports:
      - "8000:8000"
# REMOVED THIS
#    volumes:
#      - .:/code
    env_file:
      - environment.txt
    expose:
      - "8000"
# ADDED THIS
    working_dir: /code/
  nginx:
    build: ./nginx
    image: 734309331381.dkr.ecr.us-west-2.amazonaws.com/nginx:latest
    ports:
      - 80:80
      - 443:443
    depends_on:
      - web

据我了解,volumes: .:/code 将我当前的本地路径映射到远程 /code/ 路径,远程计算机上显然不存在该路径。

我不确定working_dirs 是否必要,但它将command 运行的路径更改为容器中的/code/ 路径。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多