我正在使用docker-compose和v3.我正在尝试在docker中安装一个卷:
./appdata:/appdata
我希望将其作为卷,然后从多个容器引用该卷.的卷配置参考仅示出了data-volume:作为命名体积,用没有值,因此它不会像以上.
services:
nginx:
build: ./nginx/
ports:
- 80:80
links:
- php
volumes:
- app-volume
php:
build: ./php/
expose:
- 9000
volumes:
- app-volume
volumes:
app-volume: ./appdata:/appdata
Run Code Online (Sandbox Code Playgroud)
这给了我:
错误:在文件'./docker-compose.yml'中,卷'app-volume'必须是映射而不是字符串.
显然我知道我需要更改volumes键/值对,但我不知道如何更改它以便我可以在服务之间共享卷.
我也检查过,volumes_from但这实际上只允许从其他容器继承.我看到有人volumes_from在另一个包含他们想要的映射的容器上使用,但是command: true设置为容器从未实际运行,这对我来说就像是一个黑客.
我怎样才能做到这一点?
注意,我确实有以下工作:
nginx:
volumes:
- ./appdata:/appdata
php:
volumes:
- ./appdata:/appdata
Run Code Online (Sandbox Code Playgroud)
但这只是重复而且是我希望命名卷可以帮助我避免:-)
为了跟踪docker-compose使用的卷,我喜欢使用命名卷.这适用于"普通"卷
version: 2
services:
example-app:
volume:
-named_vol:/dir/in/container/volume
volumes:
named_vol:
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何在安装本地主机时使其工作.我正在寻找类似的东西:
version: 2
services:
example-app:
volume:
-named_homedir:/dir/in/container/volume
volumes:
named_homedir: /c/Users/
Run Code Online (Sandbox Code Playgroud)
要么
version: 2
services:
example-app:
volume:
-/c/Users/:/home/dir/in/container/ --name named_homedir
Run Code Online (Sandbox Code Playgroud)
这是以任何可能的方式,还是我坚持使用已安装的匿名卷?
我有以下 docker-compose 文件:
version: "3.3"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
volumes:
- esdata:/usr/share/elasticsearch/data
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
ports:
- "9300:9300"
- "9200:9200"
volumes:
esdata:
Run Code Online (Sandbox Code Playgroud)
(为了清晰起见,我删除了其他服务)我可以在 /var/lib/ docker /volumes/ project_name _esdata 中看到卷,但我希望能够在 docker-compose.yml 所在的目录中创建卷,但我没有找不到办法这样做。
灵感来自How to set a path on host for a named volume in docker-compose.yml,我试过了
version: "3.3"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
volumes:
- esdata:/usr/share/elasticsearch/data
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
ports:
- "9300:9300"
- "9200:9200"
volumes:
esdata:
driver: local
driver_opts:
type: 'none' …Run Code Online (Sandbox Code Playgroud) 此dockerfile按预期工作.但问题是我无法改变音量来源.
version: "3.5"
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: india3391
image: shantanuo/mysql:5.7
ports:
- mode: ingress
target: 3306
published: 3391
protocol: tcp
volumes:
- type: volume
source: dbvol
target: /var/lib/mysql
volumes:
dbvol: {}
Run Code Online (Sandbox Code Playgroud)
它似乎在默认的docker安装中创建一个如下所示的directory_name + volume_name文件夹...
"Source": "/var/lib/docker/volumes/hashi1_dbvol/_data",
Run Code Online (Sandbox Code Playgroud)
有没有办法改变这条道路?
更新:
# cat docker-compose.yml
version: "3.5"
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: india3391
image: shantanuo/mysql:5.7
ports:
- mode: ingress
target: 3306
published: 3391
protocol: tcp
volumes:
- type: volume
source: dbdata
target: /var/lib/mysql
volumes:
dbdata:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/srv4/db-data'
Run Code Online (Sandbox Code Playgroud)
只有在我第一次创建安装目录时,此撰写文件才有效 …
我正在构建我的容器,docker-compose我想使用Docker的新卷API,但我不知道如何.
我想能够说docker-compose up -d:
我有以下示例
version: '2'
services:
proxy:
container_name: proxy
hostname: proxy
image: nginx
ports:
- 80:80
- 443:443
volumes:
- proxy_conf:/etc/nginx
- proxy_htdocs:/usr/share/nginx/html
volumes:
proxy_conf: {}
proxy_htdocs: {}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.当我运行docker-compose up它时,创建那些命名的卷/var/lib/docker/volumes,一切都很好.但是,从主机,我只能/var/lib/docker以root身份访问,因为它root:root(有意义).我想知道是否有一种方法可以chown将主机的目录更加明智/安全(比如,我用来在主机上做大部分工作的相对无特权的用户),或者我是否只需要chown手动操作它们.我已经开始有许多脚本可以解决其他问题了,所以有一个额外的几行不会有太大的问题,但我真的想保持自编自动化最小化,如果我可以 - 减少愚蠢错误的机会.
顺便说一句,没有:如果我挂载主机目录而不是创建卷,它们会被覆盖,这意味着如果它们开始为空,它们将保持为空,并且我没有从容器内部获得默认配置(或其他任何内容).
额外点:我可以将卷移到更方便的位置吗?说,/home/myuser/myserverstuff/volumes?
需要澄清这里的评论:
绑定挂载的唯一“问题”是它不会自动将容器内容复制到主机,这与命名卷不同。docs.docker.com/compose/compose-file/#volumes
这准确吗?如果是,那么:
bind mount当使用(在容器重新启动时保留数据)时,如何将容器的“新数据”(例如不断增长的数据库)获取到主机中?named volumes?我想使用 Docker MySQL。
docker run mysql
但我不想在主机上保存数据。我希望所有信息都在容器内受到保护。默认情况下,此映像创建了一个未命名的卷,并将其附加到容器。
是否可以使用相同的容器(我不想从地面创建新的 MySQL 映像),但禁用该卷?
换句话说: docker hub 中的许多 Docker 镜像默认使用卷。将所有数据保存在容器内的最简单方法是什么(因此推送和提交将包含数据)?有一个命令可以停止容器,更改其安装设置,然后重新启动?
我知道这不是最佳实践,我的问题是是否可能。
我有这个简单的docker-compose.yaml(图片来自danielemaddaluno/self-service-password):
version: "3"
services:
ltb:
image: danielemaddaluno/self-service-password
ports:
- 8080:80
volumes:
- ./conf:/var/www/html/conf/
Run Code Online (Sandbox Code Playgroud)
目前的行为是:
./conf不存在,则在主机上创建/var/www/html/conf/我想要的行为是:
./conf不存在,则在主机上创建/var/www/html/conf/(到新创建的./conf主机文件夹)这可以用 docker compose 实现吗?