У меня есть служба, работающая внутри докера с использованием nginx и php-fpm. Я бился головой о стену, чтобы все журналы перенаправлялись на стандартный вывод. Подход, который я выбрал, заключался в использовании supervisord. С помощью docker-compose up my-app
все заработало как положено; все журналы отправляются на стандартный вывод. Однако когда я бегу
docker run -p 81:80 \
-v $(pwd)/myapp:/var/www/html \
my-app
Я ничего не получаю.
Вот моя конфигурация супервизора:
[supervisord]
nodaemon=true
user=root
[program:php-fpm]
command=/usr/sbin/php-fpm7.0 -F
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
[program:nginx-log-access]
command=/usr/bin/tail -f /var/log/nginx/access.log
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
autorestart=true
[program:nginx-log-error]
command=/usr/bin/tail -f /var/log/nginx/error.log
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
autorestart=true
[program:php-fpm-log]
command=/usr/bin/tail -f /var/log/php7.0-fpm.log
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
autorestart=true
startsecs=3
[program:laravel-log]
command=/usr/bin/tail -f /var/www/html/storage/logs/laravel.log
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
autorestart=true
и мой docker-compose
version: '3'
services:
my-app:
build:
context: ../../my-app
dockerfile: docker/Dockerfile
image: my-app
ports:
- "81:80"
volumes:
- ../../my-app:/var/www/html
мой базовый файл докеров
FROM ubuntu
# Update
RUN apt-get update --fix-missing && apt-get -y upgrade
# Install Python Setup Tools
RUN apt-get install -y python-pip
# Intall Supervisord
RUN easy_install supervisor
# Install NGINX
RUN apt-get -y install nginx
# Install PHP
RUN apt-get -y install php7.0-fpm \
php7.0-mbstring \
php7.0-xml \
php7.0-curl
# Configure PHP-FPM
RUN sed -i 's/;daemonize = .*/daemonize = no/' /etc/php/7.0/fpm/php-fpm.conf && \
sed -i "/;clear_env = .*/c\clear_env = no" /etc/php/7.0/fpm/pool.d/www.conf && \
sed -i -e 's/max_execution_time = 30/max_execution_time = 300/g' /etc/php/7.0/fpm/php.ini && \
sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 50M/g' /etc/php/7.0/fpm/php.ini && \
sed -i -e 's/post_max_size = 8M/post_max_size = 50M/g' /etc/php/7.0/fpm/php.ini && \
sed -i -e "s/variables_order = \"GPCS\"/variables_order = \"EGPCS\"/g" /etc/php/7.0/fpm/php.ini && \
service php7.0-fpm start && \
service php7.0-fpm stop
COPY supervisor.conf /etc/supervisor/conf.d/supervisor.conf
CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisor.conf"]
и мое приложение dockerfile
FROM mybase
# Configure NGINX
COPY docker/dev2/default.conf /etc/nginx/sites-enabled/default
# Copy application into container
COPY . /var/www/html
RUN touch /var/www/html/storage/logs/laravel.log && \
chown www-data:www-data /var/www/html/storage/logs/laravel.log && \
chmod 644 /var/www/html/storage/logs/laravel.log
COPY docker/dev2/supervisor.conf /etc/supervisor/conf.d/supervisor.conf
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisor.conf"]
В чем разница между docker
и docker-compose
где перенаправление на стандартный вывод ведет себя иначе? Эти контейнеры будут развернуты в AWS ECS; Я еще не тестировал это, но боюсь, что не смогу успешно войти в ECS, если у меня такое поведение с docker
. Будем очень признательны за любые мысли, идеи или предложения!
Когда ты бежишь docker-compose up
вывод из всех контейнеров докеров агрегируется и отображается в консоли согласно
https://docs.docker.com/compose/reference/up/
Когда ты просто бежишь docker run
вывод не отображается и может быть получен только с помощью docker logs -f $CONTAINERID
Вы также можете «скрыть» вывод с помощью docker compose, используя -d
флаг.
Когда вы запускаете свои контейнеры докеров в ECS, в определении задачи вы можете выбрать драйвер журнала из списка
http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html
Надеюсь это поможет.