docker-撰写 tmpfs 不工作
docker-compose tmpfs not working
我有一个 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
文件系统工作正常。
我一直在做这方面的一些测试,看起来 /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
的符号链接,因此您创建 /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
坐骑。
有些图片像 alpine
目录 /var/run
只是 link 到 /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
it looks like the /var/run directory is special in docker.
不是,只是因为它是一个link
我有一个 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
文件系统工作正常。
我一直在做这方面的一些测试,看起来 /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
的符号链接,因此您创建 /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
坐骑。
有些图片像 alpine
目录 /var/run
只是 link 到 /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
it looks like the /var/run directory is special in docker.
不是,只是因为它是一个link