【发布时间】:2021-09-17 12:08:09
【问题描述】:
总的来说,我仍然在学习 docker-compose 和 docker 容器的一些功能。我不清楚使用绑定将主机文件夹映射到容器文件夹与使用类似的映射作为卷之间的区别。不清楚这与声明卷有什么关系。例如,我在 docker-compose.yml 文件中定义了很多容器,但我开始使用这两个来解决我的问题:
# MPPS testing server, DICOM
python_mpps:
build: python_mpps
image: sdscotti/python_mpps
depends_on: [mysql_db,pacs-1,pacs-2]
ports: ["104:11112"]
volumes:
- type: bind
source: ./python_mpps/scripts_log
target: /scripts
- type: bind
source: ./tls
target: /etc/python/tls
- type: volume
source: MWL
target: /MWL
volume:
nocopy: true
tty: true
# MWL server, REST API
python_mwl_api:
build: python_mwl_api
image: sdscotti/python_mwl_api
depends_on: [mysql_db,pacs-1,pacs-2]
ports: ["5000:5000"]
environment:
PORT: 5000
FLASK_DEBUG: 1
FLASK_ENV: development
volumes:
- type: bind
source: ./python_mpps/scripts_log
target: /scripts
- type: bind
source: ./tls
target: /etc/python/tls
- type: volume
source: MWL
target: /MWL
volume:
nocopy: true
tty: true
volumes:
MWL:
我在 Mac (Catalina) 上使用 Docker Desktop,在 LINUX 上只使用 CLI,但这与 OS X 相关。如果我进入两个容器中的 bash shell 并检查 /etc/python/tls 中的内容,我在 ./tls 中查看我的主机上还有什么,这是我希望看到的(例如)
docker exec -it 37fabd30c9afe6ca290a3e7f279a7a677061b0fbbc6277650d7055a285fb1ca4 /bin/sh
# cd /etc/python/tls
# ls
USAGE.md copy-tls-to-docker-volumes.sh nginx-crt.pem nginx.cnf
ca.cnf generate-tls.sh nginx-key.pem
同样适用于每个容器中的 /scripts。按预期映射到主机,这就是启动时启动的 python 脚本和日志文件的位置。
# cd /scripts
# ls
mpps.log mpps.py
#
我应该说这些脚本文件夹仅由该特定容器使用并且不与其他容器共享,而主机上的 ./tls 由许多容器读取,但根本不写入。那就是将 ssl .crt 和 .key 文件复制到服务器,因为这是通配符证书。
如果我随后查看容器中的 /MWL 文件夹,我确实看到了我期望看到的内容:
# cd /MWL
# ls
test.wl
#
但我不知道它在我的 OS X 主机系统上的什么位置。我可以这样做:
docker volume inspect orthanc_docker_ris_MWL
[
{
"CreatedAt": "2021-07-06T21:08:20Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "orthanc_docker_ris",
"com.docker.compose.version": "1.29.2",
"com.docker.compose.volume": "MWL"
},
"Mountpoint": "/var/lib/docker/volumes/orthanc_docker_ris_MWL/_data",
"Name": "orthanc_docker_ris_MWL",
"Options": null,
"Scope": "local"
}
]
实际上可能在某处:
/Users/xxxx/Library/Containers/com.docker.docker/Data/vms
我想要做的是将卷映射到主机上易于访问的位置,例如 docker-compose.yml 文件的根目录。使用 bind 实际上确实可以正常工作,但是我在写入由多个容器绑定的文件夹时遇到问题。不确定这是否是与 docker 本身相关的限制,或者我的一个容器是否实际上锁定了文件夹。目标确实是有一个可以从多个容器读取和写入的共享绑定或挂载,而不是可以具有相同功能的卷,但我希望将卷映射到所描述的文件夹。
我确实有 2 个“Orthanc PACS”实例也在运行,我尝试让它们也使用该卷,看起来就是这种情况,因为 Docker Desktop 显示总共绑定了 4 个容器,上面的 2 个或其他 2 人。
orthanc_docker_ris_MWL
In use by 4 containers
CREATED
38 minutes ago
这实际上是我想要的,但我必须看看我是否可以从多个容器写入卷,然后最好将它放在我的 docker-compose 文件的根目录中,而不是放在我的某个不起眼的地方我不知道的某种格式的系统。
还可能提到,在 OS X 上设置很少有其他问题,因为某些容器(即 nginx 和 php 使用主管)需要很长时间才能启动(可能需要几分钟,尽管在那之后工作正常),还有这个问题:
global.stat permission issue 在别处提到。这也发生在 LINUX 上,看起来有很多人有这个问题。
我认为 Docker Desktop for OS X 还不错,但使用 LINUX 主机要好得多。我的 NGINX - LINUX 上的 PHP 容器立即启动,所以它必须与主机文件系统管理器有关。
注意:
如果我从一个卷更改为一个绑定并删除该卷,它的设置与我想要的非常相似,但我必须测试是否有多个容器可以写入它。我怀疑 PACS 可能以某种方式锁定了该文件夹。
- type: bind
source: ./MWL
target: /MWL
【问题讨论】:
标签: docker docker-compose docker-volume docker-desktop