人们如何处理Docker容器的持久存储?
我目前正在使用这种方法:构建映像,例如PostgreSQL,然后启动容器
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
Run Code Online (Sandbox Code Playgroud)
恕我直言,有缺点,我不能(偶然)删除容器"c0dbc34fd631".
另一个想法是将主机卷"-v"安装到容器中,但是,用户ID的容器内不一定匹配用户ID从主机,然后权限可能会混乱.
注:与其--volumes-from 'cryptic_id'你也可以使用--volumes-from my-data-container这里my-data-container是你分配到纯数据容器,如姓名docker run --name my-data-container ...(见接受的答案)
我是码头工人的新手.我只是尝试在我的本地机器(Ubuntu 16.04)中使用docker和Jenkins.
我使用下面的管道脚本配置了一个新作业.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它失败并出现以下错误.
我想列出已装入卷的所有容器目录.
即我能得到类似的信息
docker inspect --format "{{ .Volumes }}" <self>
Run Code Online (Sandbox Code Playgroud)
但是从容器内部并没有docker安装在那里.
我试过cat /proc/mounts,但我找不到合适的过滤器.
我有一个托管Oracle Linux的虚拟机,我已经安装了Docker并使用docker-compose文件创建了容器.我将jenkins卷放在共享文件夹下,但是当启动docker-compose时,我得到了Jenkins的以下错误:
詹金斯| 触摸:无法触摸'/var/jenkins_home/copy_reference_file.log':权限被拒绝jenkins | 无法写入/var/jenkins_home/copy_reference_file.log.错误的卷权限?詹金斯退出了代码1
这是卷声明
volumes:
- "/media/sf_devops-workspaces/dev-tools/continuous-integration/jenkins:/var/jenkins_home"
Run Code Online (Sandbox Code Playgroud) 我通过docker-compose文件启动六个或七个容器.一个容器造成了重大问题!以下是相关部分:
services:
...
main-app:
image: mycompany/sys:1.2.3
container_name: "main-app-container"
ports:
- "8080:8080"
- "8009"
volumes:
- db_data:/var/lib/home/data:rw
- /opt/mycompany/sys/config:/opt/mycompany/sys/config:rw
networks:
- systeminternal
hostname: "mylocalhost.company.com"
volumes:
db_data:
driver: local
networks:
systeminternal:
Run Code Online (Sandbox Code Playgroud)
当main-app-container通过docker-compose up(作为root用户)启动时,已提交容器中的许多目录中的文件系统权限都将更改为root!这是在Ubuntu 14.04,Docker 1.12.x上运行的(不确定是哪个x).
我们有另一个系统,我们作为本地用户运行一切.当我们将shell写入该容器时,所有文件权限都是我们的本地用户,它在提交时是所有权.从谷歌搜索,我很确定它与卷有关,但找不到任何确定的东西.欢迎任何帮助!
我在使用Docker容器时遇到了一个有点恼人的问题(我在Ubuntu上,因此没有像VMWare或b2d那样的虚拟化).我已经构建了我的映像,并且有一个正在运行的容器,它有一个来自我的主机的共享(挂载)目录,以及一个来自我的主机的共享(挂载)文件.这是docker run完整的命令:
docker run -dit \
-p 80:80 \
--name my-container \
-v $(pwd)/components:/var/www/components \
-v $(pwd)/index.php:/var/www/index.php \
my-image
Run Code Online (Sandbox Code Playgroud)
这很好用,并且/components(和它的内容)和文件都被适当地共享.但是,当我想要更改目录(例如添加新文件或文件夹),或编辑已安装的文件(或目录中的任何文件)时,由于权限不正确,我无法这样做.运行ls- lFh的表演owner和group所安装的项目已更改为libuuid:libuuid.修改文件或父目录需要root权限,这会阻碍我的工作流程(因为我使用的是Sublime Text,而不是Terminal,我会看到管理员权限的弹出窗口).
为什么会这样?我该如何解决这个/正确处理?从管理数据卷:将主机文件作为数据卷安装:
注意:许多用于编辑文件的工具(包括vi和sed --in-place)可能会导致inode更改.从Docker v1.1.0开始,这将产生一个错误,例如"sed:无法重命名./sedKdJ9Dy:设备或资源忙".在您要编辑已安装文件的情况下,通常最容易安装父目录.
这似乎表明,与其安装/components和/index.php,我应该不是安装两者的父目录.理论上听起来很棒,但根据-v选项的行为以及它与之交互的方式/directory,我的父目录中的每个文件都会被更改为拥有libuuid:libuuid.另外,我在容器中有很多东西在容器中不需要 - 比如构建工具,各种文件,一些压缩文件夹等.挂载整个父目录似乎是浪费.
运行chown user:group在/components和/index.php 我的主机上让我来解决这一点,似乎继续与容器同步.这是我每次运行装有主机卷的容器时都需要做的事吗?我猜测有一种更有效的方法可以做到这一点,我只是在任何地方找不到我的特定用例的解释.
我正在使用这个容器来开发另一个程序的模块,并且不想管理一个只有数据的容器 - 唯一重要的文件来自我的主机; 其他地方不需要持久性(如数据库等).
创建映像后,这是我正在使用的运行命令:
docker run -dit \
-p …Run Code Online (Sandbox Code Playgroud) 如何装入非root容器用户可写的卷?我可以使用非root用户拥有的卷或将权限设置为777.
Dockerfile:
FROM alpine
RUN adduser -D myuser
USER myuser
Run Code Online (Sandbox Code Playgroud)
构建图像:
docker build -t example .
Run Code Online (Sandbox Code Playgroud)
运行图像,查看用户不可写的/ app
% docker run -i -t -v myapp:/app example /bin/sh
/ $ whoami
myuser
/ $ ls -lha / | grep app
drwxr-xr-x 2 root root 4.0K Nov 12 21:01 app
/ $
Run Code Online (Sandbox Code Playgroud)
我们可以看到app是全局可读的,但只能由root写入.
我对这个问题感到沮丧有一段时间了,因为这里已经多次询问这个问题,例如在如何处理 Docker 中的持久存储(例如数据库)和什么是管理 Docker 共享卷的权限的(最佳)方法?,但答案根本没有解决问题。
第一个“答案”说只使用named volumes而不是传统的bind mounts. 这解决不了任何问题,因为当命名卷安装在主机上时,例如在默认位置/var/lib/docker/volumes/<volume name>/_data,那么该安装点将具有容器内安装点的uid/ 。gid
在 docker 命名卷之前给出的另一个“答案”是使用纯数据容器。这展示了同样的问题。
这对我来说是一个巨大的问题,因为我有很多嵌入式机器,我想在其中运行 docker 主机,并且用户在每台机器上可能有不同的uid/ 。gid因此,我无法在 Dockerfile 中对持久卷的挂载点硬编码uid/来实现匹配。gidid
这是问题的一个示例:假设我的用户foo位于主机上,具有uid 1001和gid 1001,并且将文件写入容器内的卷的用户具有uid 1002。当我运行容器时,docker将chown 1002:1002在主机上安装点目录,并用它写入文件uid,我什至无法用我的用户读取/写入文件foo。
视觉上(主机上的所有这些操作):
$ docker volume create --driver local --opt type=volume --opt device=/home/<my_host_user>/logs --opt o=bind logs
logs
$ docker volume inspect logs …Run Code Online (Sandbox Code Playgroud) permissions containers file-permissions docker docker-volume
Postgres,mariadb,mysql不使用USER.据推测,正在审查官方图像是否符合最佳实践文档,该文档要求用户尽可能使用.为什么?
我正在学习 Docker,面临以下问题,主要与服务之间共享文件有关。我准备了一个例子:
我的程序有 3 个阶段Dockerfile:builder、php和caddy。我docker-compose.yml 定义了 2 个服务:php和caddy(目标是 中的相应阶段Dockerfile)。要求:
public/build/metatada.json)public/js/foo.js)public/bundles/foo.js)public/与 php 服务共享文件夹,因为可以创建新文件(即 user public/uploads/newfile.pdf)public/img/newimage.png(即)解决方案 1:我的第一个天真的解决方案不起作用,因为第 4 点: caddy 服务无法访问php 服务在运行时创建的资源(即public/uploads/new.png):
FROM node:current-alpine as builder
WORKDIR /app
COPY . .
RUN npm …Run Code Online (Sandbox Code Playgroud) 在我们的内部测试环境中,我们从基于 vSphere 的服务器配置 CentOS VM。这些图像是 vanilla 7.1,带有软件包和相关配置,以支持通过 LDAP 进行身份验证。我在 xfs 文件系统上安装了 Docker 1.13.1 和 OverlayFS 驱动程序。
FROM centos:7
RUN useradd dockeruser
USER dockeruser
VOLUME /data
Run Code Online (Sandbox Code Playgroud)
在主机上:
mkdir data
echo "hello from host" > data/host-msg.txt
docker run -ti --rm -v $(pwd)/data:/data testimage bash
Run Code Online (Sandbox Code Playgroud)
容器内部:
echo "hello from container" > /data/container-msg.txt
bash: /data/container-msg.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)
列出容器内的目录内容:
drwxr-xr-x 2 12345 13000 25 Feb 12 21:36 data
drwxr-xr-x 5 root root 360 Feb 12 21:36 dev
drwxr-xr-x 1 root root 62 Feb 12 21:36 …Run Code Online (Sandbox Code Playgroud) 我是容器和 docker 的新手,请耐心等待。我正在尝试在 Synology NAS 上启动并运行 mongo,其中 db 文件存储在共享文件夹中(与创建的 docker 文件夹不同)。所有用户都具有完全读/写访问权限,但以下错误不断出现。
STORAGE [initandlisten] exception in initAndListen std ::exception:boost::filesystem::status: Permission denied: "/data/db/storage.bson", terminating
这就是我设置容器文件夹结构的方式。我认为问题是虚拟驱动器映射的结果,但我不确定。与往常一样,任何帮助将不胜感激。

编辑:在下面添加 /share/data/db 的权限。
假设我有一个保存一些数据的 Docker 容器。我希望这些数据能够持续存在 - 如果容器被停止、删除、升级等。我仍然希望数据位于主机操作系统文件系统上的可访问位置。
目前,我的解决方案是在我的主机上创建一个目录/srv/service-name(我使用 Ubuntu 14.10),然后使用参数运行我的服务-v /srv/service-name:/path/inside/container。
通过反复试验,我发现有时容器无法写入此内容,因为它没有正确的权限。我发现这个问题,其中仅提供数据容器作为解决方案。好吧,我不想使用容器,因为它对于我正在做的事情来说似乎不必要地复杂。我宁愿继续用-v.
那么,如何为正在挂载的目录设置正确的权限呢?
docker ×13
jenkins ×2
linux ×2
permissions ×2
containers ×1
dockerfile ×1
inspect ×1
mongodb ×1
mount ×1
nas ×1
synology ×1
ubuntu ×1
virtualbox ×1