Cormax/docker compose中运行docker容器的顺序错误

Cormax/docker compose中运行docker容器的顺序错误,docker,docker-compose,convox,Docker,Docker Compose,Convox,这是我正在使用的compose文件。它由一个postgres db容器和一个redis容器组成。在它们之上,我有一个gunicorn django python web服务器(docker图片:python-3.5)。有一个nginx代理服务器链接到web容器 version: '2' services: nginx: build: ./nginx/ ports: - 80:80 volumes: - /usr/src/app/static

这是我正在使用的compose文件。它由一个postgres db容器和一个redis容器组成。在它们之上,我有一个gunicorn django python web服务器(docker图片:python-3.5)。有一个nginx代理服务器链接到web容器

version: '2'
services:

  nginx:
    build: ./nginx/
    ports:
      - 80:80
    volumes:
      - /usr/src/app/static
    links:
      - web

  web:
    build: ./web
    ports:
      - 8000:8000
    volumes:
      - /usr/src/app/static
    env_file: .env
    environment:
      DEBUG: 'true'
      SECRET_KEY: 5(15ds+i2+%ik6z&!yer+ga9m=e%jcqiz_5wszg)r-z!2--b2d
      DB_NAME: postgres
      DB_USER: postgres
      DB_PASS: postgres
      DB_SERVICE: postgres
      DB_PORT: 5432
    command: /usr/local/bin/gunicorn messanger.wsgi:application -w 2 -b :8000
    links:
      - redis
      - postgres

  postgres:
    image: postgres
    ports:
      - 5432
    volumes:
      - pgdata:/var/lib/postgresql/data/

  redis:
    image: redis
    ports:
      - 6379
    volumes:
      - redisdata:/data
我在通过启动docker容器时遇到问题

convox start -f docker-compose.yml
问题是,理想情况下,首先启动postgres/redis服务器,然后根据链接顺序启动web服务器,最后启动nginx服务器。但实际上,web服务器是首先启动的,因此它在没有db/cache的情况下会失败。请参阅下面的错误日志:

web      │ running: docker run -i --rm --name python-app-web -e DB_NAME=postgres -e DB_USER=postgres -e DB_PASS=postgres -e DB_SERVICE=postgres -e DB_PORT=5432 -e DEBUG=true -e SECRET_KEY=5(15ds+i2+%ik6z&!yer+ga9m=e%jcqiz_5wszg)r-z!2--b2d --add-host redis: -e REDIS_SCHEME=tcp -e REDIS_HOST= -e REDIS_PORT=
 -e REDIS_PATH= -e REDIS_USERNAME= -e REDIS_PASSWORD= -e REDIS_URL=tcp://:%0A --add-host postgres: -e POSTGRES_SCHEME=tcp -e POSTGRES_HOST= -e POSTGRES_PORT=
 -e POSTGRES_PATH= -e POSTGRES_USERNAME= -e POSTGRES_PASSWORD= -e POSTGRES_URL=tcp://:%0A -p 0:8000 -v /Users/gaurav/.convox/volumes/python-app/web/usr/src/app/static:/usr/src/app/static python-app/web sh -c /usr/local/bin/gunicorn messanger.wsgi:application -w 2 -b :8000
web      │ invalid argument "redis:" for --add-host: invalid IP address in add-host: ""
web      │ See 'docker run --help'.
postgres │ running: docker run -i --rm --name python-app-postgres -p 5432 -v pgdata:/var/lib/postgresql/data/ python-app/postgres
redis    │ running: docker run -i --rm --name python-app-redis -p 6379 -v redisdata:/data python-app/redis
但当我完全移除nginx服务器时,它工作正常,在这种情况下,web服务器在postgres/redis之后被关闭

我无法理解实际的错误

完整的代码可以在github上找到


[注意]发现了一件非常奇怪的事情,这是我从未料到的。问题在于容器的名称。如果我将“ngnix”容器重命名为server/webserver/xyz/myngnix/ngnixxx等,那么一切都按照预期的顺序运行。但不是用ngnix这个名字!奇怪吧。

只需添加
取决于
docker compose.yml的
指令

version: '2'
services:
  depends_on:
    - web
  nginx:
    build: ./nginx/

    ports:
      - 80:80
    volumes:
      - /usr/src/app/static

  web:
    build: ./web
    depends_on:
     - postrges
     - redis
    ports:
      - 8000:8000
    volumes:
      - /usr/src/app/static
    env_file: .env
    environment:
      DEBUG: 'true'
      SECRET_KEY: 5(15ds+i2+%ik6z&!yer+ga9m=e%jcqiz_5wszg)r-z!2--b2d
      DB_NAME: postgres
      DB_USER: postgres
      DB_PASS: postgres
      DB_SERVICE: postgres
      DB_PORT: 5432
    command: /usr/local/bin/gunicorn messanger.wsgi:application -w 2 -b :8000

  postgres:
    image: postgres
    ports:
      - 5432
    volumes:
      - pgdata:/var/lib/postgresql/data/

  redis:
    image: redis
    ports:
      - 6379
    volumes:
      - redisdata:/data

运行集装箱的顺序将是确定的。但这并不意味着当web应用程序尝试连接到redis时,该容器将可用。如果你想达到这个目标,你需要这样的东西或

如果你需要保证开始顺序,那么你需要看看这样的东西。这不是我想要的,我只是希望所有的容器都以链接顺序开始。db/cache是否已准备好在各个端口上侦听,这不是实际的问题。如果仔细查看错误日志,请运行包含无效主机和ip条目的命令。这就是问题所在。我也试过了…它不起作用。。。我也不想被黑客攻击什么的。。我想知道链接容器不工作的原因
links
指令不能保证容器运行顺序。让我看看web容器Dockerfile和entrypoint.sh