web-dev-qa-db-ja.com

docker-compose tmpfsが機能しない

作成するコンテナーのルートボリュームを読み取り専用にすることで保護しようとしているdocker-composeファイルがあります。

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を使用してコンテナのインスタンスを実行すると、tmpfsエントリがあっても/var/run/mysqldディレクトリは読み取り専用のままであり、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ユーザーのUIDが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ファイルシステムは正常に機能します。

14
koehn

私はこれに関していくつかのテストを行っています、/var/runディレクトリはdockerで特別なようです。

以下はサンプルの設定と出力です。

  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へのシンボリックリンクであるため、tmpfsが機能しないため/var/run/mysqlを作成するためです。

これを/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マウントを共有することもできます。

26
dalore

Alpineのようないくつかの画像/var/run/runへのリンクにすぎません。

$ docker run --rm -ti mariadb:10.1 ls -lh /var/run
lrwxrwxrwx 1 root root 4 Aug  7 13:02 /var/run -> /run

つまり、/var/run/mysqldは実際には/run/mysqldです。

更新されたdocker-compose.ymlは

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

その場合、tmpfsが/runを指すようにするだけです。

/ var/runディレクトリはdockerで特別なようです。

いいえ、それは単にリンクだからです

1
Muayyad Alsadi