相关疑难解决方法(0)

如何处理Docker中的持久存储(例如数据库)

人们如何处理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 ...(见接受的答案)

docker docker-container

969
推荐指数
10
解决办法
28万
查看次数

尝试在unix上连接到Docker守护程序套接字时获得权限被拒绝:///var/run/docker.sock

我是码头工人的新手.我只是尝试在我的本地机器(Ubuntu 16.04)中使用docker和Jenkins.

我使用下面的管道脚本配置了一个新作业.

node {
    stage('Build') {
      docker.image('maven:3.3.3').inside {
        sh 'mvn --version'
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它失败并出现以下错误.

在此输入图像描述

jenkins docker jenkins-pipeline

111
推荐指数
15
解决办法
10万
查看次数

如何从容器中列出Docker挂载的卷

我想列出已装入卷的所有容器目录.

即我能得到类似的信息

docker inspect --format "{{ .Volumes }}" <self>
Run Code Online (Sandbox Code Playgroud)

但是从容器内部并没有docker安装在那里.

我试过cat /proc/mounts,但我找不到合适的过滤器.

mount inspect docker

12
推荐指数
1
解决办法
8892
查看次数

詹金斯错误的卷权限

我有一个托管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)

virtualbox shared-directory jenkins docker docker-compose

12
推荐指数
3
解决办法
1万
查看次数

Docker - 由docker-compose启动的容器,将文件所有权更改为root

我通过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 docker-compose

10
推荐指数
1
解决办法
1012
查看次数

共享卷/文件权限/所有权(Docker)

我在使用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的表演ownergroup所安装的项目已更改为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)

linux docker

9
推荐指数
1
解决办法
6900
查看次数

如何在docker中以非root用户身份写入卷容器?

如何装入非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

8
推荐指数
1
解决办法
6052
查看次数

如何为 Docker 主机上的卷挂载点指定 userid 和 groupid

我对这个问题感到沮丧有一段时间了,因为这里已经多次询问这个问题,例如在如何处理 Docker 中的持久存储(例如数据库)什么是管理 Docker 共享卷的权限的(最佳)方法?,但答案根本没有解决问题。

第一个“答案”说只使用named volumes而不是传统的bind mounts. 这解决不了任何问题,因为当命名卷安装在主机上时,例如在默认位置/var/lib/docker/volumes/<volume name>/_data,那么该安装点将具有容器内安装点的uid/ 。gid

在 docker 命名卷之前给出的另一个“答案”是使用纯数据容器。这展示了同样的问题。

这对我来说是一个巨大的问题,因为我有很多嵌入式机器,我想在其中运行 docker 主机,并且用户在每台机器上可能有不同的uid/ 。gid因此,我无法在 Dockerfile 中对持久卷的挂载点硬编码uid/来实现匹配。gidid

这是问题的一个示例:假设我的用户foo位于主机上,具有uid 1001gid 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

7
推荐指数
1
解决办法
6042
查看次数

为什么Docker官方图像不按照"最佳实践"的要求使用USER

Postgres,mariadb,mysql不使用USER.据推测,正在审查官方图像是否符合最佳实践文档,该文档要求用户尽可能使用.为什么?

docker dockerfile

6
推荐指数
1
解决办法
84
查看次数

解决涉及容器共享的依赖资源的 Docker 组合场景?

我正在学习 Docker,面临以下问题,主要与服务之间共享文件有关。我准备了一个例子:

插图

我的程序有 3 个阶段Dockerfilebuilderphpcaddy。我docker-compose.yml 定义了 2 个服务phpcaddy(目标是 中的相应阶段Dockerfile)。要求:

  1. 构建器阶段在运行时生成 php 服务所需的一些文件(即public/build/metatada.json
  2. 构建器阶段在运行时生成 caddy 服务所需的一些文件(即public/js/foo.js
  3. php 阶段生成一些在运行时可供球童服务使用的文件(即public/bundles/foo.js
  4. caddy 服务必须public/与 php 服务共享文件夹,因为可以创建新文件(即 user public/uploads/newfile.pdf
  5. 必须考虑源代码中的新静态文件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)

docker docker-compose docker-volume

6
推荐指数
1
解决办法
269
查看次数

Docker 主机挂载卷权限

在我们的内部测试环境中,我们从基于 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)

linux docker docker-volume docker-engine

5
推荐指数
1
解决办法
5475
查看次数

在 Synology NAS 上通过 docker 启动 mongo

我是容器和 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 的权限。

文件夹权限

nas mongodb synology docker

4
推荐指数
1
解决办法
9222
查看次数

我需要启用哪些权限才能使 Docker 卷正常工作?

假设我有一个保存一些数据的 Docker 容器。我希望这些数据能够持续存在 - 如果容器被停止、删除、升级等。我仍然希望数据位于主机操作系统文件系统上的可访问位置。

目前,我的解决方案是在我的主机上创建一个目录/srv/service-name(我使用 Ubuntu 14.10),然后使用参数运行我的服务-v /srv/service-name:/path/inside/container

通过反复试验,我发现有时容器无法写入此内容,因为它没有正确的权限。我发现这个问题,其中仅提供数据容器作为解决方案。好吧,我不想使用容器,因为它对于我正在做的事情来说似乎不必要地复杂。我宁愿继续用-v.

那么,如何为正在挂载的目录设置正确的权限呢?

permissions ubuntu docker

3
推荐指数
1
解决办法
598
查看次数