如何在 Pycharm 调试时使用 Docker-compose 运行所有服务?

4
我是一位能帮助您翻译文本的助手。
我有一个简单的Django Gunicorn、Nginx和PostgreSQL项目(每个服务都被Docker化了)。
当我使用docker-compose up运行它时,一切正常:
maximd@ubuntu ~/PycharmProjects/MyQ (master) $ docker-compose ps

     Name                    Command               State          Ports        
-------------------------------------------------------------------------------
myq_database1_1   docker-entrypoint.sh postgres    Up      5432/tcp            
myq_djangoapp_1   /bin/sh -c gunicorn --bind ...   Up      8000/tcp            
myq_nginx_1       nginx -g daemon off;             Up      0.0.0.0:8000->80/tcp

然而,当我使用PyCharm调试器启动它时,它不会运行nginx。
我怀疑,由于djangoapp依赖于我的docker-compose.yml文件中的数据库服务,它只是创建了它们两个,但没有运行nginx。
以下是我在使用PyCharm调试器运行后看到的内容:
maximd@ubuntu ~/PycharmProjects/MyQ (master) $ docker-compose ps
     Name                    Command               State                  Ports               
----------------------------------------------------------------------------------------------
myq_database1_1   docker-entrypoint.sh postgres    Up       5432/tcp                          
myq_djangoapp_1   python -u /opt/.pycharm_he ...   Up       0.0.0.0:55488->55488/tcp, 8000/tcp
myq_nginx_1       nginx -g daemon off;             Exit 0                                     

因此,我的问题是:是否有办法让nginx也成为djangoapp的依赖项?是否有办法使PyCharm运行所有服务而不仅仅是我试图调试的那个服务?

以下是我的docker-compose.yml文件:

version: '3'

services:

  djangoapp:
    build: .
    volumes:
      - .:/services/djangoapp
      - static_volume:/services/djangoapp/static
      - media_volume:/services/djangoapp/media
    networks:
      - nginx_network
      - database1_network
    depends_on:
      - database1

  nginx:
    image: nginx:1.13
    ports:
      - 8000:80
    volumes:
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - static_volume:/services/djangoapp/static
      - media_volume:/services/djangoapp/media
    depends_on:
      - djangoapp
    networks:
      - nginx_network

  database1:  # <-- IMPORTANT: same name as in DATABASES setting, otherwise Django won't find the database!
    image: postgres:10
    env_file:
      - config/db/database1_env
    networks:
      - database1_network
    volumes:
      - database1_volume:/var/lib/postgresql/data

networks:
  nginx_network:
    driver: bridge
  database1_network:
    driver: bridge

volumes:
  database1_volume:
  static_volume:
  media_volume:

这里是我的调试配置和解释器配置的图片。远程解释器 输入图像描述

你尝试过在配置中将“Service”部分留空吗? - pawamoy
@pawamoy,实际上当我考虑一下的时候,不,我会在下班后今天尝试它。 - Maxim Dunavicher
我尝试了一些其他可能相关的事情: 在调试配置中:单个实例复选框,选中和取消选中,都没有做任何事情。在调试配置中:将工作目录设置为: /services/djangoapp(Docker容器中项目的根目录)也没有做任何事情。 - Maxim Dunavicher
我真的认为将Service留空会解决你的问题。如果你指定了djangoapp服务,那么nginx容器就不会启动。但实际上这可能不是一个问题,因为在本地/开发/调试中,你不需要nginx:gunicorn就足够了。也许尝试在你的docker-compose中为djangoapp服务绑定- ports: 8000:8000 - pawamoy
@pawamoy,我昨天尝试了你的建议,但是PyCharm不允许将服务留空,因为它正在尝试在服务内部定位Python解释器。 - Maxim Dunavicher
实际上,PyCharm是允许这样做的。你用的是哪个版本?我使用的是专业版。在docker-compose配置中留空服务是可行的,然后PyCharm会运行docker-compose -f compose_file.yml up -d来解决你的问题。 - pawamoy
2个回答

2
最终解决了,修复的方法是更改docker-compose.yml文件为以下内容:
version: '3'

services:

  djangoapp:
    build: .
    restart: always
    volumes:
      - .:/services/djangoapp
      - static_volume:/services/djangoapp/static
      - media_volume:/services/djangoapp/media
    networks:
      - nginx_network
      - database1_network
    depends_on:
      - database1
      - nginx

  nginx:
    image: nginx:1.13
    restart: always
    ports:
      - 8000:80
    volumes:
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - static_volume:/services/djangoapp/static
      - media_volume:/services/djangoapp/media
    networks:
      - nginx_network

  database1:  # <-- IMPORTANT: same name as in DATABASES setting, otherwise Django won't find the database!
    image: postgres:10
    env_file:
      - config/db/database1_env
    networks:
      - database1_network
    volumes:
      - database1_volume:/var/lib/postgresql/data

networks:
  nginx_network:
    driver: bridge
  database1_network:
    driver: bridge

volumes:
  database1_volume:
  static_volume:
  media_volume:

基本上是让djangoapp依赖于nginx,并在nginx和djangoapp中添加“重启:始终”的设置。
同时,在Run/Debug Configurations窗口中:
主机是:0.0.0.0
工作目录:/services/djangoapp(类似于djangoapp内部的那个)
路径映射:/home/maximd/PycharmProjects/MyQ=/services/djangoapp

0

我怀疑你的nginx容器自己崩溃了,只需检查docker logs myq_nginx_1


docker logs myq_nginx_1 返回了一些日志,但时间表明这些日志都来自于 docker-compose up 命令,没有任何与 Django 调试器运行相关的时间。 - Maxim Dunavicher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接