如何在docker-compose文件中将`links替换为`depends_on`?

Fra*_*ain 2 nginx docker docker-compose

搬运工撰写文档指定对links已被废弃,应替换depends_on。我不知道确切如何。

这是links具有3个服务的应用程序的工作docker-compose文件(带有说明):

  • Nginx反向代理
  • 一个nodejs应用
  • 一个PHP API

version: "3.1"

services:

  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./php/content:/srv/www/content
      - ./static:/srv/www/static
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - php:php-app
      - nodejs:nodejs-app

  nodejs:
    image: node:alpine
    environment: 
      NODE_ENV: production
    working_dir: /home/app
    restart: always
    volumes:
      - ./nodejs:/home/app
    links:
      - php:php-app
    command: ["node", "index"]

  php:
    image: php:apache
    volumes:
      - ./php:/var/www/html
Run Code Online (Sandbox Code Playgroud)

相关的nginx default.conf

server {
  listen 80;
  root /srv/www;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;

  location / {
    try_files $uri @nodejs;  
  }

  location /api {
    rewrite ^([^.\?]*[^/])$ $1/ break;
    proxy_pass http://php-app:80;
  }

  location @nodejs {
    proxy_pass http://nodejs-app:8080;
  }
}
Run Code Online (Sandbox Code Playgroud)

这些links说明将别名从docker服务名称proxy_pass 命名为nginx conf中的名称。

如何linksdepends_on不修改nginx配置的情况下替换docker-compose文件中的指令(并保留别名)?

Ale*_*hin 5

docker compose文档指定links已弃用,应将替换为depends_on

它不是。文档只说

links还以与相同的方式表示服务之间的依赖关系depends_on,因此它们确定了服务启动的顺序。

我看不出结论如何,您应该使用depends_on而不是links。相反,它说,如果您需要在另一个容器中的某个容器中运行某些内容,则应使用depends_on,而不是links。(例如,您commandphp容器中指定正在运行的迁移,并且需要等待postgres容器)。

另一方面,links有警告说

除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不要使用--link

在此背景下,--link对于dockerCLI是一样的东西linksdocker-compose.yml

到目前为止,如果您的容器位于一个网络上,则不需要任何其他特殊规范。除非另行指定,否则默认网络驱动程序为bridge。因此,如果您指定docker-compose.yml以下内容,则应将所有容器放在一个网络上并自动相互识别。

version: "3.1"

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./php/content:/srv/www/content
      - ./static:/srv/www/static
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  nodejs:
    image: node:alpine
    environment: 
      NODE_ENV: production
    working_dir: /home/app
    restart: always
    volumes:
      - ./nodejs:/home/app
    command: ["node", "index"]
  php:
    image: php:apache
    volumes:
      - ./php:/var/www/html
Run Code Online (Sandbox Code Playgroud)

在这种情况下nginx应与

location / {
    try_files $uri nodejs;
}
Run Code Online (Sandbox Code Playgroud)

location /api {
    rewrite ^([^.\?]*[^/])$ $1/ break;
    proxy_pass http://php:80;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么您需要服务别名。您放入docker-compose.yml中的服务名称用作别名。您可以在每个容器的`/ etc / hosts`中找到它们。在最坏的情况下,您可以使用`container_name`。 (2认同)