Docker -составить для nginx, php, mysql, golang - PullRequest
0 голосов
/ 10 апреля 2020

Сервер теперь работает с этой конфигурацией.

version: '3'
services:
    nginx:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./www:/var/www
        depends_on:
            - php
    php:
        build: ./docker/images/php
        volumes:
            - ./www:/var/www
    mysql:
        image: mysql       
        ports:
            - "3306:3306"
        volumes:
            - ./docker/mysql:/var/lib/mysql
            - ./docker/import:/docker-entrypoint-initdb.d
        environment:
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

Dockerfile для php image

# Main image
FROM php:7.3-fpm

# Update and install modules for php and other
RUN apt-get update && apt-get install -y \      
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && apt-get install -y wget zip unzip git \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd pdo mysqli pdo_mysql \
    && docker-php-ext-enable mysqli

# Workdir for php
WORKDIR /var/www

# Run container
CMD ["php-fpm"]

Я хочу добавить golang контейнер к этой конфигурации, чтобы я может запустить выполнение golang файлов из cron.

Вопросы:

  • Каков наилучший способ сделать это?
  • Как добавить его специально к docker-compose / Dockerfile и запустить из cron?

1 Ответ

1 голос
/ 10 апреля 2020

== Вариант 1: добавить docker-compose к crontab ==

* * * * * cd <project dir>/docker-compose && command docker-compose -f docker-compose.yml run --rm -T -w /go/bin <go_app_container> <go_app_name>

== Вариант 2: использовать cron-docker ==

Вот это Docker изображений для запуска cron внутри Docker контейнера

Добавление хрон задания с cron-docker

Предположим, у вас есть папка cron.d с вашими скриптами cron. Единственное, что вам нужно сделать, это скопировать эту папку в Docker изображение:

# Dockerfile

FROM renskiy/cron:debian

COPY cron.d /etc/cron.d

Затем собрать и создать контейнер:

docker build --tag my_cron .
docker run --detach --name cron my_cron

Просмотр журналов

Для просмотра журналов используйте команду Docker logs :

docker logs --follow cron

Все сценарии cron должны записывать журналы в /var/log/cron.log. В противном случае вы не сможете просмотреть любой журнал, используя этот способ.

Передача заданий cron по аргументам

Кроме того, вы можете передавать любое задание cron по аргументу (ам) с помощью custom * Команда 1057 * в момент создания контейнера (предоставляя необязательному пользователю опцию -u / --user):

docker run --detach --name cron renskiy/cron:debian start-cron --user www-data \
    "0 1 \\* \\* \\* echo '01:00 AM' &gt;&gt; /var/log/cron.log 2&gt;&1" \
    "0 0 1 1 \\* echo 'Happy New Year!!' &gt;&gt; /var/log/cron.log 2&gt;&1"

Переменные окружения

Почти любая переменная окружения, которую вы передали Docker будет виден вашим скриптам cron. За исключением $SHELL, $PATH, $PWD, $USER и др. c.

docker run --tty --rm --interactive --env MY_VAR=foo renskiy/cron:debian start-cron \
    "\\* \\* \\* \\* \\* env &gt;&gt; /var/log/cron.log 2&gt;&1"

== Вариант 3: используйте cron-docker с docker-compose ==

Для вашего случая:

version: '3'
services:
    nginx:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./www:/var/www
        depends_on:
            - php
    php:
        build: ./docker/images/php
        volumes:
            - ./www:/var/www
    mysql:
        image: mysql       
        ports:
            - "3306:3306"
        volumes:
            - ./docker/mysql:/var/lib/mysql
            - ./docker/import:/docker-entrypoint-initdb.d
        environment:
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    cron_go_app:
      image: renskiy/cron:alpine
      volumes:
        - crontabs:/etc/crontabs
        - my_go_app:/app/my_go_app
      run: start-cron
...