我有一个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:
Run Code Online (Sandbox Code Playgroud)
麻烦的是,tmpfs
没有被创造.如果我运行使用容器的一个实例docker-compose run --rm mysql /bin/bash
,该/var/run/mysqld
目录仍然是只读的,尽管tmpfs
条目,任何企图touch /var/run/mysqld/foo
将失败.由于这是MySQL放置其socket和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 …
Run Code Online (Sandbox Code Playgroud) 我在运行 django 测试的 docker 容器中有一个 Postgres 数据库。我想提高测试的速度。最简单的方法(在我看来)是将 postgres 数据移动到 tmpfs 卷中。
这是我所做的:
docker run --name my_tfmps_test -d -p 5432:5432 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=my_database \
-e PGDATA=/var/lib/postgresql/data \
--tmpfs /var/lib/postgresql/data \
library/postgres
Run Code Online (Sandbox Code Playgroud)
因为我指定了--tmpfs
我希望测试运行得更快。不幸的是,这种情况并非如此。测试的速度保持完全相同的水平(给予或接受 5%)。
我的问题是:为什么测试速度没有改变?我该怎么办?
额外信息:
我遇到了一个奇怪的scala-io
moveTo
方法问题.这是我的文件系统,tmp
目录位于ram中.
~ % df -Th ~/ :) Filesystem Type Size Used Avail Use% Mounted on rootfs rootfs 112G 18G 89G 17% / /dev devtmpfs 3.9G 0 3.9G 0% /dev run tmpfs 3.9G 236K 3.9G 1% /run /dev/sda btrfs 112G 18G 89G 17% / shm tmpfs 3.9G 872K 3.9G 1% /dev/shm tmpfs tmpfs 3.9G 34M 3.9G 1% /tmp
将文件从tmp
主目录移动到主目录或向后移动时,首先它的速度很慢(主观上约为1M/s,而iotop
显示为1500M/s),其次是100%的CPU负载.在同一文件系统中移动文件时,一切都按预期工作.
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_03).
Type …
Run Code Online (Sandbox Code Playgroud) 我今天必须编写一个Bash脚本来删除重复文件,使用它们的md5哈希值.我将这些哈希值存储为临时目录中的文件:
for i in * ; do
hash=$(md5sum /tmp/msg | cut -d " " -f1) ;
if [ -f /tmp/hashes/$hash ] ;
then
echo "Deleted $i" ;
mv $i /tmp/deleted ;
else
touch /tmp/hashes/$hash ;
fi ;
done
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但让我想知道:这是一种节省时间的方法吗?我最初想过将MD5哈希存储在一个文件中,但后来我想"不,因为检查给定的MD5是否在这个文件中需要每次都重新读取它".现在,我想知道:使用"在目录中创建文件"方法时它是一样的吗?当同一目录中有大量文件时,Bash [-f]是否检查线性或准常量复杂度?
如果它取决于文件系统,那么tmpfs的复杂性是多少?
我有一个案例,有两个进程作用于同一个文件 - 一个作为写入器,一个作为读取器。该文件是一行文本文件,编写器在循环中重写该行。读者阅读该行。伪代码如下所示:
写入程序
char buf[][18] = {
"xxxxxxxxxxxxxxxx",
"yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
pwrite(fd, buf[i], 18, 0);
i = (i + 1) % 2;
}
Run Code Online (Sandbox Code Playgroud)
读者进程
while(1) {
pread(fd, readbuf, 18, 0);
//check if readbuf is either buf[0] or buf[1]
}
Run Code Online (Sandbox Code Playgroud)
运行这两个进程一段时间后,我可以看到readbuf
是xxxxxxxxxxxxxxxxyy
或yyyyyyyyyyyyyyyyxx
。
我的理解是对于最大 512 字节的写入将是原子的。但从我的实验来看,原子性似乎只针对 16 个字节。
手册页没有提及任何关于普通文件的原子性,它只提到了 512 字节的管道原子性。
我已经用 tmpfs 和 ext4 尝试过,结果是相同的。使用O_SYNC
ext4 写入变得原子,我理解它,因为写入在到达磁盘之前不会返回,但O_SYNC
对 tmpfs ( ) 没有帮助/dev/shm
。
有没有人尝试过运行 postgresql 容器并将 tmpfs 卷挂载到 pgsql_tmp?(我想象的任何具有临时文件目录的数据库)
\n\n有没有引起什么问题?
\n\n这是一个坏主意吗?
\n\n其他有用信息?
\n\ndocker tmpfs
- “与卷和绑定挂载相反,tmpfs 挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs 挂载将被删除,写入其中的文件将不会被保留\xe2\x80\x99。 ”
pgsql_tmp
- “临时文件(用于对超出内存容量的数据进行排序等操作)在 PGDATA/base/pgsql_tmp 中创建,或者在表空间目录的 pgsql_tmp 子目录中创建(如果为其指定了 pg_default 以外的表空间)。临时文件的格式为 pgsql_tmpPPP.NNN,其中 PPP 是所属后端的 PID,NNN 区分该后端的不同临时文件。”
将此发布出来供社区参考和研究。感谢您的帮助。
\n\n曾多次经历过人工数据库填充 inode 的情况。重新启动堆栈后,必须手动删除 tmp 文件,这花了大约一个小时。
\n我想在内存中运行整个 docker 容器,而不将卷映射到主机的硬盘驱动器。
此处描述的 TMPFS有助于将卷安装为“内存卷”,但我正在寻找一种方法来启动映射到内存的整个容器。
--volume-driver
可能是我必须使用的,但我找不到支持的驱动程序的文档列表(不是overlay2
)。
所以,我尝试过:
docker run -td --name my-container --volume-driver tmpfs container-image
docker run -td --name my-container --volume-driver memfs container-image
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,docker inspect my-container
我观察到:
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/d1d112972c6b531976dd33e27edf213fc578856c3ee96b99c9afe53ad3f71a5e- ... /diff",
"MergedDir": "/var/lib/docker/overlay2/d1d112972c6b531976dd33e27edf213fc578856c3ee96b99c9afe53ad3f71a5e/merged",
"UpperDir": "/var/lib/docker/overlay2/d1d112972c6b531976dd33e27edf213fc578856c3ee96b99c9afe53ad3f71a5e/diff",
"WorkDir": "/var/lib/docker/overlay2/d1d112972c6b531976dd33e27edf213fc578856c3ee96b99c9afe53ad3f71a5e/work"
},
"Name": "overlay2"
}
Run Code Online (Sandbox Code Playgroud)
docker stats
还指出这两种情况都使用默认映射策略。
我正在开发一个有两个内存节点的 NUMA 服务器。
我想创建一个将加载到主内存中的文件系统,例如 tmpfs 或 ramfs,并且我想将其绑定到特定的内存节点。换句话说,我不希望 ramfs 内容在两个内存节点上交错。
那么我怎样才能实现这一目标呢?
我尝试了带有 --file 选项的 numactl 命令,但它似乎只适用于单个文件(我需要加载一个目录)。
谢谢
在我们的 GitLab CI 环境中,我们有一个具有大量 RAM 和机械磁盘的构建服务器,运行 npm install 需要很长时间(我添加了缓存,但它仍然需要处理现有的包,因此缓存无法单独解决所有这些问题)。
我想在构建器 docker 映像中挂载 /builds 作为 tmpfs,但我很难弄清楚将此配置放在哪里。我可以在构建器映像本身中执行此操作,还是可以在 .gitlab-ci.yml 中为每个项目执行此操作?
目前我的 gitlab-ci.yml 看起来像这样:
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
cache:
key: node_modules-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
stages:
- test
test:
image: docker-builder-javascript
stage: test
before_script:
- npm install
script:
- npm test
Run Code Online (Sandbox Code Playgroud) 我tmpfs
使用以下命令在 Ubuntu 上的主目录中创建了一个文件系统:
$ mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0777 tmpfs space
$ df -h space .
File system Size Used Avail. Avail% Mounted at
tmpfs 1,0G 100M 925M 10% /home/user/space
/dev/mapper/ubuntu--vg-root 914G 373G 495G 43% /
Run Code Online (Sandbox Code Playgroud)
然后我写了这个Python程序:
#!/usr/bin/env python3
import time
import pickle
def f(fn):
start = time.time()
with open(fn, "rb") as fh:
data = pickle.load(fh)
end = time.time()
print(str(end - start) + "s")
return data
obj = list(map(str, range(10 * 1024 * 1024))) # approx. 100M
def …
Run Code Online (Sandbox Code Playgroud)