【问题标题】:Why is docker-compose not building the containers in the correct order?为什么 docker-compose 没有以正确的顺序构建容器?
【发布时间】:2022-01-17 13:58:26
【问题描述】:

这是 docker-compose

version: '3'
services:
  creator:
    build:
      context: .
      dockerfile: Dockerfile.php
    image: creator_image
    container_name: creator_container
    restart: always
    volumes:
      - ./:/var/www
      - ./config/php/php.ini:/usr/local/etc/php/conf.d/php.ini

  artisan:
    image: creator_image
    command: sh -c 'php artisan optimize && php artisan config:cache && php artisan
      view:cache && php artisan view:clear && php artisan config:cache'
    container_name: creator_container_artisan
    depends_on:
      - creator

  cron:
    image: creator_image
    command: sh -c '(crontab -l 2>/dev/null; echo "* * * * * cd /var/www && php
      artisan schedule:run >> /dev/null 2>&1")| crontab - && /usr/sbin/crond
      start -f'
    container_name: cronjobs_container
    restart: always
    volumes:
      - ./:/var/www
      - ./config/php/php.ini:/usr/local/etc/php/conf.d/php.ini
    depends_on:
      - creator

  webserver:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    image: nginx_image
    container_name: nginx_container
    restart: always
    ports:
      - "80:80"
      - "443:443"

    volumes:
      - ./:/var/www
      - ./docker/logs:/var/logs

Docker 构建将失败并会给出以下错误

pull access denied for creator_image, repository does not exist or may require ‘docker login’

上面的 docker-compose 构建 Laravel 容器和 Nginx,还清除了一些 Laravel 缓存并重新创建它,以及运行 Laravel cronjobs。

在执行 docker-compose up --build 时构建失败,因为 Docker 尝试在 creator 之前运行 artisan 容器

解决此问题的唯一方法是注释掉 artisancron 容器,并在构建完成后读取它们。如何解决这个问题? depends_on 没有解决这个问题。

不管我添加多少depends_on,显然是it's deprecated,有没有办法强制Docker以正确的顺序构建容器?

【问题讨论】:

  • docker-compose build && docker-compose up?
  • @super 解决了这个问题!老实说,我没想到。非常感谢!

标签: laravel docker docker-compose dockerfile


【解决方案1】:

Compose 没有任何构建顺序或构建依赖项的概念。

另一方面,重建相同的镜像几乎是免费的:Docker 可以检测到您在完全相同的输入文件上运行完全相同的命令,并跳过执行任何实际工作。如果您在所有三个容器中都有相同的 build: 块,Compose 将“构建”镜像三次,但其中两个将使用 Docker 构建缓存,最后您将拥有一个具有三个名称的镜像。

如果你通过让每个容器build: (相同的)图像来清理它;删除 container_name:image: 选项(Compose 会为这些选项生成合理的默认值);删除depends_on:(容器之间显然没有建立网络连接);并删除 volumes: 挂载(代码应为 COPYed 到图像中);然后这减少到

version: '3.8'
services:
  creator:
    build: .
    restart: always

  artisan:
    build: .
    command: sh -c 'php artisan optimize && php artisan config:cache && php artisan
      view:cache && php artisan view:clear && php artisan config:cache'

  cron:
    build: .
    command: sh -c '(crontab -l 2>/dev/null; echo "* * * * * cd /var/www && php
      artisan schedule:run >> /dev/null 2>&1")| crontab - && /usr/sbin/crond
      start -f'
    restart: always

【讨论】:

  • 真的应该删除这些卷吗? PHP 文件可能会在容器启动后被编辑,因此 PHP 文件必须在保存时自动更新
  • 我不知道如果文件相同,docker 会跳过构建,谢谢指出
猜你喜欢
  • 2022-01-14
  • 2023-01-22
  • 1970-01-01
  • 2016-05-15
  • 2023-01-22
  • 2021-04-03
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多