2017-01-27 5 views
4

У меня есть файл-файл для докеры, который я пытаюсь защитить, создав тома корней из контейнеров, которые он создает только для чтения.docker-compose tmpfs не работает

Соответствующие части docker-compose.yml:

version: '2' 
services: 
    mysql: 
    image: mariadb:10.1 
    read_only: true 
    tmpfs: 
    - /var/run/mysqld:uid=999,gid=999 
    - /tmp 
    volumes: 
    - mysql:/var/lib/mysql 
    restart: always 
volumes: 
    mysql: 

Проблема есть, tmpfs не создается. Если я запускаю экземпляр контейнера, используя docker-compose run --rm mysql /bin/bash, каталог /var/run/mysqld по-прежнему доступен только для чтения, несмотря на запись tmpfs, и любая попытка touch /var/run/mysqld/foo не удалась. Так как именно MySQL создает свой сокет и файл pid, это приводит к сбою всего процесса. Я не уверен, почему запись tmpfs не работает в этом случае.

mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ... 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using mutexes to ref count buffer pool pages 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: The InnoDB memory heap is disabled 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Compressed tables use zlib 1.2.8 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using Linux native AIO 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using SSE crc32 instructions 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Initializing buffer pool, size = 256.0M 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Completed initialization of buffer pool 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Highest supported file format is Barracuda. 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: 128 rollback segment(s) are active. 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: Waiting for purge to start 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.34-79.1 started; log sequence number 239403989 
mysql_1 | 2017-01-27 20:53:48 140515005662976 [Note] InnoDB: Dumping buffer pool(s) not yet started 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] Plugin 'FEEDBACK' is disabled. 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [Note] Server socket created on IP: '::'. 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Can't start server : Bind on unix socket: Read-only file system 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ? 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Aborting 

Я могу проверить права доступа к каталогу правильны (и что УИД mysql пользователя 999):

$ ls -la /var/run/mysqld 
total 8 
drwxrwxrwx 2 mysql mysql 4096 Jan 17 22:14 . 
drwxr-xr-x 4 root root 4096 Jan 18 22:55 .. 

Но я до сих пор не могу:

$ touch /var/run/mysqld/foo 
touch: cannot touch '/var/run/mysqld/foo': Read-only file system 

Даже если я выполняю роль root.

Любые идеи, что я делаю неправильно?

Как в стороне, файловая система /tmp работает нормально.

+0

Вы используете докеры? https://docs.docker.com/compose/compose-file/#tmpfs говорит: «Примечание: этот параметр игнорируется при развертывании стека в режиме роя с помощью файла (файл версии 3)». – six8

+0

Nope. Спрячьте докер. – koehn

+0

Я тоже.(наполнитель) – Otheus

ответ

2

Я делаю некоторые испытания в этом отношении, похоже, что каталог /var/run является специальным в докере.

Вот некоторые примеры конфигурации и выход:

ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    tmpfs: 
     - /var/run 
     - /var/cache 

docker-compose up ubuntu Запуск показывает, что установлен. Может видеть, /var/cache установлен, но /var/run нет.

... 
ubuntu_1   | tmpfs on /var/cache type tmpfs (rw,nosuid,nodev,noexec,relatime) 
... 

Если вы используете docker-compose run ubuntu bash вы можете увидеть это также установлен там, но не /var/run.

Причина в том, что /var/run обычно является символической ссылкой на /run и, следовательно, вы создаете /var/run/mysql, поскольку tmpfs не работает.

Это будет работать, если вы измените его на /run/mysql, но /run обычно монтируется как TMPFS в любом случае, так что вы можете также просто сделать /run TMPFS. Как так:

ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    tmpfs: 
     - /run 
     - /var/cache 

Примечание: Я хотел бы изменить свой ответ и показать, как сделать это с помощью volumes:

services: 
    ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    volumes: 
     - cache_vol:/var/cache 
     - run_vol:/run 

volumes: 
    run_vol: 
    driver_opts: 
     type: tmpfs 
     device: tmpfs 
    cache_vol: 
    driver_opts: 
     type: tmpfs 
     device: tmpfs 

Это также позволяет разделить tmpfs крепления, если это необходимо.

+0

В соответствии с документацией tmpfs монтирования нельзя распространять среди контейнеров: https://docs.docker.com/engine/admin/volumes/tmpfs/#limitations-of-tmpfs-containers –

+0

Да, монтирование 'tmpfs' не может, но выше - это том, который использует тип tmpfs. Это не монтирование tmpfs, а монтирование тома с помощью устройства tmpfs. Который теоретически может быть разделен, как и любой другой том. – dalore

Смежные вопросы