Особенности работы Docker контейнеров MySQL и Nginx на OSX

В ожидании релиза Docker for mac приходится использовать Docker Machine и решать проблемы которые он создает при работе с Data Volumes. О решении проблем в MySQL и Nginx я бы и хотел рассказать.

Официальный контейнер MySQL работает как и ожидаешь, пока в файле docker-compose.yml не добавлено хранение /var/lib/mysql на Data Volume:

mysql:
  image: mysql:5.7
  volumes:
    - ./data/mysql:/var/lib/mysql

После таких манипуляций демон MySQL откажется загружаться будет сыпать проклятиями:

InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.

Для исправления этого необходимо создать небольшой скрипт, который возьмет UID и GID директории /var/lib/mysql и присвоит их пользователю и группе mysql. Пример такого скрипта mysql-entrypoint.sh:

#!/bin/bash
set -e
echo '* Working around permission errors locally by making sure that "mysql" uses the same uid and gid as the host volume'
TARGET_UID=$(stat -c "%u" /var/lib/mysql)
echo '-- Setting mysql user to use uid '$TARGET_UID
usermod -o -u $TARGET_UID mysql || true
TARGET_GID=$(stat -c "%g" /var/lib/mysql)
echo '-- Setting mysql group to use gid '$TARGET_GID
groupmod -o -g $TARGET_GID mysql || true
echo
echo '* Starting MySQL'
chown -R mysql:root /var/run/mysqld/
/entrypoint.sh mysqld --user=mysql --console

Далее монтируем этот скрипт внутрь контейнера и заменяем им оригинальный entrypoint MySQL:

mysql:
  image: mysql:5.7
  command: "/mysql-entrypoint.sh"
  volumes:
    - ./data/mysql-entrypoint.sh:/mysql-entrypoint.sh
    - ./data/mysql:/var/lib/mysql

На этом проблемы с MySQL закончились и время поговорить о контейнере Nginx. При работе со статикой из Data Volume он жеcтко кеширует файлы и реал тайм редактирование css или js превращается в пытку.

http {
  ...
  sendfile off;
  tcp_nopush off;
  tcp_nodelay off;
  ...
}

Если такое произошло, то в nginx.conf можно добавить эти три параметра в секцию http, после чего сделать рестарт контейнера и проблема решена.