Docker-compose 运行本地会导致远程模块未发现错误



>我有以下内容:

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 撰写文件有问题,但我不明白为什么它可以在本地运行良好。

回答我自己的问题,以防其他人停下来。

我将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/路径。

最新更新