繁体   English   中英

Docker 从 docker-compose 扩展入口点脚本

[英]Docker extend entrypoint script from docker-compose

我对 Docker 很陌生。

我对我的 Laravel 应用程序进行了 docker 化。 这是基本图像php:8.1.2-apache

在 Dockerfile 结束时,我使用自己的入口点脚本

ENTRYPOINT ["/usr/local/bin/start"]

该脚本( /usr/local/bin/start )包含一些命令,例如

composer install --no-interaction && 
php artisan config:cache && 
php artisan route:cache && 
php artisan view:cache && 
php artisan storage:link

现在我将这个 Docker Image 用于许多事情,如 laravel 调度程序、队列等......

我想要做的是从 docker-compose 文件扩展入口点脚本,这样每当容器启动时,入口点脚本首先被执行,然后最终将从 docker-compose 传递的主命令被执行。

就像是:

  laravel-scheduler:
    image: laravel
    container_name: laravel-scheduler
    restart: always
    volumes:
      - .:/var/www/html
    command: php artisan schedule:work

第一的

您可以创建 build_entrypoint.sh

#!/bin/bash

composer install --no-interaction && 
php artisan config:cache && 
php artisan route:cache && 
php artisan view:cache && 
php artisan storage:link

并在基础 Dockerfile 中使用它ENTRYPOINT ["./build_entrypoint.sh"]

在 docker-compose 中,您可以覆盖行为:在命令部分手动启动/build_entrypoint.sh + 扩展命令

类似command: /bin/sh -c "./build_entrypoint.sh && ./test_running.sh"

.

第二:漂亮

使用基于主 php 映像的守护程序在 docker-compose 中启动新服务。

码头工人/php/Dockerfile

FROM php:8.1-fpm

# ... others commands (setup composer and php-ext(s))

# Attention! We run this command to build our image
RUN composer install --no-interaction && 
  php artisan config:cache && 
  php artisan route:cache && 
  php artisan view:cache && 
  php artisan storage:link

码头工人-compose.yml

# Main php service
php:
    build:
        context: docker/php    # path to your dockerfile
    volumes:
        - .:/var/www/html

# PHP WORKER service with daemon work
php-worker:
    build:
        context: docker/php    # path to your dockerfile
    volumes:
        - .:/var/www/html
    command: php artisan schedule:work

只需使用exec "$@"结束入口点脚本。 它将遵循 Compose command:完全按照您描述的方式。

#!/bin/sh

# Do first-time setup steps that can't be done in the Dockerfile
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan storage:link

# Run the main container command
exec "$@"

另请参阅 Dockerfile 文档中的了解 CMD 和 ENTRYPOINT 如何交互CMD (或 Compose command:覆盖)作为参数传递给您的入口点脚本。 exec "$@"调用是一个 shell 命令,用这些命令行参数替换当前 shell。

另一个重要的警告是,在 Dockerfile 中, ENTRYPOINT必须是 JSON-array exec 形式 如果它是裸字符串外壳形式,外壳包装会阻止它工作。 您在问题中显示的语法是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM