Docker后期运行预配的最佳方法

问题描述 投票:0回答:2

我对Docker还是很陌生,我试图找到哪种方法是在我的容器启动后进行Docker配置的最佳方法。我们使用docker-compose文件来组成容器,并且撰写文件看起来像这样。

version: "3"

  php:
    image: wodby/drupal-php:$PHP_TAG
    container_name: "${PROJECT_NAME}_php"
    environment:   
      DB_HOST: $DB_HOST
      DB_PORT: $DB_PORT
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
      DB_NAME: $DB_NAME
      DB_DRIVER: $DB_DRIVER
      PHP_FPM_USER: wodby
      PHP_FPM_GROUP: wodby
      COLUMNS: 80 # Set 80 columns for docker exec -it.
    volumes:
      - ./Insider:/var/www/html

  nginx:
    image: wodby/nginx:$NGINX_TAG
    container_name: "${PROJECT_NAME}_nginx"
    depends_on:
      - php
    environment:
      NGINX_STATIC_OPEN_FILE_CACHE: "off"
      NGINX_ERROR_LOG_LEVEL: debug
      NGINX_BACKEND_HOST: php
      NGINX_SERVER_ROOT: /var/www/html/web
      NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
    ports:
      - '8000:80'
    volumes:
      - ./Insider:/var/www/html

现在,一旦PHP容器启动,我们需要执行一些设置任务。现在,我需要一些关于在此容器中执行置备的最佳方法的想法。我们有2个想法,如下所示。

  1. 编写一个shell脚本,并将其作为我们构建过程中的任务之一。
  2. 使用ansible并从其他服务器连接以进行配置。

但是理想的过程是,如果我们能够以某种方式从docker-compose.yml文件中将一个shell脚本包含在PHP容器中,并且当我们运行docker-compose up -d时,它应该作为该容器启动过程的一部分运行,并做好一切准备,因此我们不需要通过第二个命令/进程,依此类推。

shell docker docker-compose provisioning
2个回答
1
投票

有一种为此使用入口点脚本的标准模式。

无论您指定为容器的入口点的什么,都将作为主容器进程运行,并且它将作为命令行参数传递给容器的命令。一个非常典型的入口点脚本的格式为

#!/bin/sh

# ... do startup-time setup ...

# Then launch the main container command
exec "$@"

在您的Dockerfile中,您需要照常复制它

COPY entrypoint.sh ./
# RUN chmod 0755 entrypoint.sh # if not already executable
ENTRYPOINT ["./entrypoint.sh"] # MUST be JSON-array form
CMD ["./my-app"]

入口点脚本可以访问每个执行设置,例如docker-compose.yml中设置的环境变量,并可以与在Docker中运行的其他服务联系。它可以export主容器进程将看到的环境变量。 (这些不会显示在其他面向调试的路径中,例如docker inspectdocker exec,但是docker run --rm -it myimage sh会看到它们。)一个重要的警告是入口点脚本将是容器中唯一在此运行的东西要点,因此它不能与将成为主要容器过程的东西进行交互,除非它脱离了启动它的方式(这很棘手)。

我认为ENTRYPOINT的这种用法非常有用且重要,以至于我倾向于为此目的保留该指令。如果只有ENTRYPOINT(就像许多Java SO问题一样),则可以将其更改为CMD,而不会产生不良影响。如果您已经使用ENTRYPOINT来命名解释器,并且使用CMD来命名脚本(就像许多Python SO问题一样),则可以将它们组合到单个CMD行中。


0
投票

典型的方法是在这种情况下建立自己的图像。力求在构建时将所有必需的设置放入映像中;然后通过环境变量配置其余参数。不要依赖外部脚本将现有容器带入工作状态-这会使您的部署过程更加复杂。

您可以基于wodby/drupal-php基本映像构建自己的映像,仅添加脚本并执行它。

FROM wodby/drupal-php:7

ADD ./my-script.sh /my-script.sh

ENTRYPOINT exec /my-script.sh // && do whatever the entrypoint of the base image does

© www.soinside.com 2019 - 2024. All rights reserved.