我有一个用于网站的 docker compose 文件,在用于各种目的的一堆其他容器中,包括一个具有持久数据的 mysql 数据库。目前撰写文件指定了数据的相对路径,例如:
mysql: 图像:mysql:5.7 容器名称:sqldb 卷: - ./mysql_data/_data:/var/lib/mysql
和文件夹结构:
--mysql_data --static_content docker-compose.yml
这意味着在任何时候我都可以通过复制整个文件夹并运行 docker-compose up 将整个站点(包括持久化内容)移动到另一台服务器。
但是阅读有关 docker 卷的信息,这听起来像是首选方法(使用“docker run”似乎不支持相对绑定安装路径,但可以在 compose 中工作)所以我想知道是否需要将这种方法更改为使用卷?这种相对绑定方法是否存在本质上的错误?如果我确实切换到卷,在移动容器时是否必须手动移动卷(例如,此方法如何将仅数据卷从一台主机移植到另一台主机?)?
我创建了一个 docker 卷“hello”,它包含一些数据。
怎么复制到本地?
第一的 :
kerydeMacBook-Pro:~ hu$ docker volume create --name hello
hello
Run Code Online (Sandbox Code Playgroud)
检查:
kerydeMacBook-Pro:~ hu$ docker volume ls
DRIVER VOLUME NAME
local hello
Run Code Online (Sandbox Code Playgroud)
卷“你好”检查
kerydeMacBook-Pro:~ hu$ docker volume inspect hello
[
{
"Name": "hello",
"Driver": "local",
"Mountpoint": "/mnt/sda1/var/lib/docker/volumes/hello/_data"
}
]
Run Code Online (Sandbox Code Playgroud)
如何将卷“hello”复制到本地?
我尝试:
kerydeMacBook-Pro:~ hu$ docker cp hello:/mnt/sda1/var/lib/docker/volumes/hello/_data /Users/hu/Desktop/12
Error response from daemon: no such id: hello
Run Code Online (Sandbox Code Playgroud)
它不像预期的那样工作!
谁能帮我 ?
我对如何使用命名数据卷(不是数据容器)感到困惑.
我有一个命名数据卷app_src
,/usr/src/app
使用docker compose文件挂载.但是,在对我的源代码(本地)进行更改后,构建映像不会更新卷.
我正在构建这样的图像,
docker-compose -f development.yml build
并运行它docker-compose -f development.yml up -d
.
为了确认卷没有改变,我附加到正在运行的容器中,并且确实没有更新源代码.
这是我的docker撰写文件development.yml
和Dockerfile
我的web
服务.版本:'2'
services:
web:
restart: always
build: ./web
expose:
- "8000"
volumes:
- app_src:/usr/src/app
links:
- postgres:postgres
env_file: development.env
command: ./start_web.sh
volumes:
app_src: {}
FROM python:3.4.4
WORKDIR /usr/src/app
RUN rm -rf /usr/src/app/*
COPY . /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我可以通过像这样安装主机来使它工作,
volumes:
- ./web/src:/usr/src/app
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu 16.04上运行docker 1.11.2.我的理解错了吗?我确实看了一下文档,但是我能找到任何能很好地解释音量的东西.
根据文档, Docker 卷的广告方式如下:
卷是持久保存 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载取决于主机的目录结构和操作系统,但卷完全由 Docker 管理。
但如果它们这么好,为什么没有像复制、重命名这样的操作来管理它们呢?
命令:
docker volume --help
Run Code Online (Sandbox Code Playgroud)
只给出这些选项:
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run Code Online (Sandbox Code Playgroud)
文档还没有说明任何其他命令,也没有任何具有复制或重命名功能的解决方法。
我想重命名当前现有的卷并创建另一个(空白)来代替最初命名的卷,并用新数据填充它以进行测试。
完成测试后,我可能希望(或不希望)删除新创建的卷,并将另一个卷重命名为之前的(原始)名称,以将卷设置恢复为之前的状态。
我不想创建要重命名的原始卷的备份。重命名对我来说已经足够好了,而且比创建备份和恢复要快得多。
编辑 docker-compose 文件并更改卷的名称也是我想避免的。
是否有任何解决方法可以用于重命名卷?
Docker Root Dir: /var/lib/docker
针对和子目录的 shell 的低级手动管理是否可以volumes
作为解决方案,或者该方法可能会导致某些 dockeremon 数据不一致?
我是Docker的新手,我想在我的计算机上映射node_modules文件夹(用于调试目的).
这是我的docker-compose.yml
web:
build: .
ports:
- "3000:3000"
links:
- db
environment:
PORT: 3000
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
db:
image: mongo:3.3
ports:
- "27017:27017"
command: "--smallfiles --logpath=/dev/null"
Run Code Online (Sandbox Code Playgroud)
我在使用Docker for Mac.当我运行docker-compose up -d
所有正确,但它在我的计算机上创建一个node_modules文件夹,但它是空的.我进入容器的bash和ls node_modules,所有包都在那里.
如何在计算机上获取容器上的内容呢?
谢谢
我正在使用Docker Apache airflow VERSION 1.9.0-2(https://github.com/puckel/docker-airflow).
调度程序生成大量日志,文件系统将快速耗尽空间,因此我尝试以编程方式删除由airflow创建的调度程序日志,可在调度程序容器中找到(/ usr/local/airflow/logs/scheduler )
我已经设置了所有这些维护任务:https: //github.com/teamclairvoyant/airflow-maintenance-dags
但是,这些任务仅删除工作服务器上的日志,而调度程序日志位于调度程序容器中.
我还设置了远程日志记录,将日志发送到S3,但正如本文中提到的删除气流任务日志中所述,此设置不会阻止气流写入本地计算机.
此外,我还尝试在worker和scheduler之间创建一个共享命名卷,如此处所述Docker Compose - 在多个容器之间共享命名卷.但是,我在worker中收到以下错误:
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'
和调度程序中的以下错误:
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler/2018-04-11'
那么,人们如何删除调度程序日志?
docker docker-compose airflow docker-volume airflow-scheduler
我对不应该使用数据容器的普遍共识感到困惑.我有特定的用例,我想完成.
我想拥有docker nginx容器,并在其后面有一些带应用程序的其他容器.要运行我的应用程序的最新版本,我想从我的私人docker注册表下载ready容器.该应用程序现在纯粹是静态的HTML,JavaScript的东西.
所以我的计划是创建将保存文件的docker image,并在some/webapp文件夹中指定一个命名卷.nginx容器将为此卷提供服务.我没有看到任何其他方式如何将一堆文件移动到远程系统"docker containerinerized"方式.我实际上没有创建被诅咒的数据容器吗?
无论如何在app容器交换期间会发生什么?当我停止app容器时,该卷仍然可以访问,因为它放在主机上.当我拉动并启动新版本的app容器时.该卷将再次创建并预先填充存储在同一位置的图像文件,替换主机上的内容,以便nginx容器将从现在的新版本的应用程序服务器.权利?当我从nginx容器引用尚不存在的卷时会发生什么.
似乎命名值不会自动与图像内容一起提交.我也不确定如何在docker文件中创建命名卷,因为从这里获取的语法不起作用
FROM training/webapp
VOLUME webapp:/webapp
Run Code Online (Sandbox Code Playgroud) 使用docker-compose synthax的v2,我们能够做到这样的事情:
version: '2'
services:
app:
image: tianon/true
volumes:
- ../app:/var/www/app
nginx:
image: nginx
volumes_from:
- app
php:
image: php
volumes_from:
- app
Run Code Online (Sandbox Code Playgroud)
volumes_from
现在是v3.2 invalid option
.该文档仅用于使用新的顶级卷synthax,即all the ways better
.我已经阅读了一些关于github的评论,也是人们提出的唯一解决方案
version: '3.2'
services:
nginx:
image: nginx
volumes:
- app:/var/www/app
php:
image: php
volumes:
- app:/var/www/app
volumes:
app:
driver_opts:
type: none
device: ../app
o: bind
Run Code Online (Sandbox Code Playgroud)
这显然看起来更糟,它甚至对我不起作用.它给了我一个错误:no such file or directory
.那么我还应该尝试什么呢?看起来我仍然可以使用links
而不是顶级卷,但它被认为是文档中的遗留选项.那么如何使用新语法做到这一点?
编辑: 问题已被确定为可能重复,但我不同意.请参阅我的评论以获得解释.
我相信有一种简单的方法可以将文件复制到已经安装到容器的 docker 卷中。
docker cp /tmp/my_data/. my_container:/my_data
如如何将多个文件复制到 docker 数据卷中所述
但是,如何使用docker volume create --name my-volume
其中已有文件的命名卷来创建?我读过将 cp 文件放入{{.Mountpoint}}
.
我是 docker 的新手,所有这些都是细微差别,如果我对卷的基本理解不正确,我深表歉意。
我只是在 Docker for Windows 上试用 WSL 2,但我在安装卷时遇到了问题:
version: "3.7"
services:
node:
build: .
container_name: node
hostname: node
volumes:
- ./app:/app
stdin_open: true
Run Code Online (Sandbox Code Playgroud)
容器构建并启动良好,我使用 docker exec 很好地访问它,但/app
容器内的文件夹未绑定到我的笔记本电脑app
文件夹。但是,正确的路径实际上已正确安装在正在运行的容器上:
(这里我在主机上执行密码,如果它与容器上安装的内容完美匹配)
? app pwd
/mnt/c/Users/willi/devspace/these/app
Run Code Online (Sandbox Code Playgroud)
这是 portainer 的屏幕,它告诉我在容器中安装了哪些路径并且一切都匹配。
我在主机上的 app 文件夹中创建的文件在容器的 app 文件夹中不可见,反之亦然。这很奇怪,我不知道如何调试它。
补充资料:
docker version
WSL 中的输出:19.03.12docker-compose version
: 1.26.2谢谢
docker docker-compose docker-volume windows-subsystem-for-linux docker-desktop