Docker: Fatal Error Не удалось создать файл блокировки: Плохой дескриптор файла (9)

Попробуйте пример из книги "Докер в действии".

$docker run -d --name wp2 --link wpdb:mysql -p 80 --read-only wordpress:4

... должно было вызвать эту ошибку...

    Read-only file system: AH00023: Couldn't create the rewrite-map mutex
(file /var/lock/apache2/rewrite-map.1)"

но это не так. Это вызвало ошибку дескриптора файла...

$docker logs wp2
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
Wed Dec  9 23:15:21 2015 (21): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:21 2015 (30): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:21 2015 (39): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:21 2015 (48): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (62): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (76): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (90): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (104): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (118): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (132): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (146): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (160): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:15:22 2015 (164): Fatal Error Unable to create lock file: Bad file descriptor (9)

В книге говорилось, что мы могли бы сделать эту работу с использованием томов, например...

$docker run -d --name wp3 --link wpdb:mysql -p 80 -v /var/lock/apache2/ -v /var/run/apache2/ --read-only wordpress:4
305e62e18d926a54ac7d1a0fb775f61efdb61486d9d9245933c3b18055bd9856

контейнер "кажется" начнется нормально
но это не...

$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6bd4d90f594b        mysql:5             "/entrypoint.sh mysql"   21 minutes ago      Up 21 minutes       3306/tcp            wpdb

журналы говорят об этом...

$docker logs wp3
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
Wed Dec  9 23:31:57 2015 (22): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:57 2015 (31): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:57 2015 (40): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:57 2015 (49): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:57 2015 (63): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (77): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (91): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (105): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (119): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (133): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (147): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (161): Fatal Error Unable to create lock file: Bad file descriptor (9)
Wed Dec  9 23:31:58 2015 (165): Fatal Error Unable to create lock file: Bad file descriptor (9)

Я не уверен, почему это происходит. В книге, которую я читаю, говорится, что это должно сработать. Я не смог найти никого другого, кто получал бы эту конкретную ошибку. Исключить флаг -read-only полностью работает.

$docker run -d --name wp3 --link wpdb:mysql -p 80 -v /var/lock/apache2/ -v /var/run/apache2/ wordpress:4
990874c73691c42d3c04aceb19f83a698f90a2f9ddcf1c07fb3cc9b9f1986723

$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
990874c73691        wordpress:4         "/entrypoint.sh apach"   5 seconds ago       Up 4 seconds        0.0.0.0:32773->80/tcp   wp3
6bd4d90f594b        mysql:5             "/entrypoint.sh mysql"   About an hour ago   Up About an hour    3306/tcp                wpdb

Ответ 1

Это похоже на решение @allingeek, но я не мог заставить это работать без явного разрешения доступа к /tmp:

docker run -d --name wp --read-only -v /run/lock/apache2/ -v /run/apache2/ -v /tmp/ --link wpdb:mysql -p 80 wordpress:4

Без -v /tmp/ у меня все еще есть выход журнала "Bad file descriptor".

Ответ 2

Быстрое исправление этой проблемы заключается в использовании более старой версии образа WordPress. Похоже, что они изменили механизмы блокировки файлов между 4.2 и 4.3. Итак, команды становятся:

$docker run -d --name wp2 --link wpdb:mysql -p 80 --read-only wordpress:4.2
$docker run -d --name wp3 --link wpdb:mysql -p 80 -v /var/lock/apache2/ -v /var/run/apache2/ --read-only wordpress:4.2

Идя глубже, похоже, что образ WordPress изменил места, где он записывает эти файлы. Чтобы обнаружить различия, я сделал следующие шаги:

  • Запустите wordpress: 4 контейнер без файловой системы только для чтения.
  • Изучите изменения файловой системы в контейнере
  • Измените пример создания томов в новых местоположениях

Этот анализ выполнялся следующим образом:

# Create the writable container
$ docker run -d --name wp10 --link wpdb:mysql -p 80 wordpress:4

# Examine the differences
$ docker diff wp10
C /run
C /run/apache2
A /run/apache2/apache2.pid
C /run/lock
C /run/lock/apache2
C /tmp

# Update the example for the new locations
$ docker run -d --name wp15 --read-only -v /run/lock/apache2/ -v /run/apache2/ --link wpdb:mysql -p 80 wordpress:4

Как вы можете видеть, изображение переместило PID и заблокировало файлы из /var в/run и добавило зависимость записи от /tmp. Понимание этого анализа важно, если вы собираетесь перевести эту тактику на другой пример.

Ответ 3

ответьте на комментарий выше - нет, он не исправляет проблему, wp появляется и остается. но не подключается к mysql. агент в очереди выходит из строя и выходит извините заранее, у меня нет достаточной репутации для комментариев выше.

ТЛ; дг

сначала запустить, чтобы начать с известной точки

docker rm -f $(docker ps -aq)  # CAUTION: this removes ALL your containers!!!

Затем запустите этот script

#!/bin/bash
# CLIENT_ID must be set or need to use script cmdline arg

docker-name() {
  docker inspect --format '{{ .Name }}' "[email protected]"
}
docker-ip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "[email protected]"
}

CLIENT_ID=DUKE

DB_CID=$(docker run -d -e MYSQL_ROOT_PASSWORD=ch2demo mysql:5)

MAILER_CID=$(docker run -d dockerinaction/ch2_mailer)

if [ ! -n "$CLIENT_ID" ]; then 
  echo "Client ID not set"
  exit 1
fi

# NOTE: using wordpress:4.2 not latest/4.3 read-only dirs changed
WP_CID=$(docker create \
  --link $DB_CID:mysql \
  --name wp_$CLIENT_ID \
  -p 80 \
  -v /var/lock/apache2/ \
  -v /var/run/apache2/ \
  -e WORDPRESS_DB_NAME=$CLIENT_ID \
  --read-only wordpress:4.2)
docker start $WP_CID

AGENT_CID=$(docker create \
  --name agent_$CLIENT_ID \
  --link $WP_CID:insideweb \
  --link $MAILER_CID:insidemailer \
  dockerinaction/ch2_agent)
docker start $AGENT_CID

echo "    Client ID: $CLIENT_ID"
echo "     MySQL ID: $(docker-name $DB_CID) IP: $(docker-ip $DB_CID)" 
echo "    Mailer ID: $(docker-name $MAILER_CID) IP: $(docker-ip $MAILER_CID)" 
echo " Wordpress ID: $(docker-name $WP_CID) IP: $(docker-ip $WP_CID)" 
echo "     Agent ID: $(docker-name $AGENT_CID) IP: $(docker-ip $AGENT_CID)" 

выход:

    Client ID: DUKE
     MySQL ID: /thirsty_sammet IP: 172.17.0.2
    Mailer ID: /sleepy_snyder IP: 172.17.0.3
 Wordpress ID: /wp_DUKE IP: 172.17.0.4
     Agent ID: /agent_DUKE IP: 

бег

docker ps -a

IMAGE                       COMMAND                  STATUS                     PORTS                   NAMES
dockerinaction/ch2_agent    "/watcher/watcher.sh"    Exited (0) 2 minutes ago                           agent_DUKE
wordpress:4.2               "/entrypoint.sh apach"   Up 2 minutes               0.0.0.0:32773->80/tcp   wp_DUKE
dockerinaction/ch2_mailer   "/mailer/mailer.sh"      Up 2 minutes               33333/tcp               sleepy_snyder
mysql:5                     "/entrypoint.sh mysql"   Up 2 minutes               3306/tcp                thirsty_sammet

поэтому Wordpress появляется и остается вверх, но агент терпит неудачу и выходит из

docker logs agent_DUKE
nc: can't connect to remote host (172.17.0.4): Connection refused

Wordpress не подключается к mysql, но не выходит

docker logs wp_DUKE
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html

Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 10

MySQL Connection Error: (2002) Connection refused

Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 10

MySQL Connection Error: (2002) Connection refused

Warning: mysqli::mysqli(): (HY000/2002): Connection refused in - on line 10

MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Sun Jan 03 23:37:38.773659 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.12 configured -- resuming normal operations
[Sun Jan 03 23:37:38.773802 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

: хост docker - vmware ubuntu 14.04x64 DT на хосте win7x64