我在 Windows Enterprise 11 主机上使用 Docker Desktop 将 java 源文件从主机复制到 docker 映像;然后,我想在容器中运行该映像,其中可以在已安装的主机目录(卷)中提供(并保留)映像中的 java 源文件,这是超级简单的用例,但它不起作用。
Dockerfile 创建“code-in-container”目录(用于映像),并将 java 源文件和子目录从“code-on-host”(本地主机)复制到“code-in-container”(在主机上) image),文本文件也被复制到“code-in-container”,该镜像是基于 Linux Alpine 基础镜像构建的。
FROM alpine:latest
RUN mkdir -p /code-in-container
COPY /code-on-host /code-in-container/
COPY file-on-host.txt /code-in-container
docker-compose 基于引用的 Dockerfile(如上所述)创建一个服务,设置从主机 -> 容器的端口转发,然后创建一个名为“some-host-directory”的绑定挂载(其中 ./ 提供应在主机上创建“some-host-directory”的上下文,这是基于 compose-file 和 Dockerfile 的托管位置),然后 compose-file 将绑定挂载映射到“/code-in-正在运行的容器(图像)中的“container”目录。 stdin_open 和 tty 用于保持容器运行,以便可以建立挂载,并且我可以访问正在运行的容器的 shell。
主机目录
version: '3'
services:
my_app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3001:3001"
volumes:
- ./some-host-directory:/code-in-container
stdin_open: true
tty: true
我使用
docker compose up -d
构建映像并在 docker 容器中运行它,“主机上的代码”包含源文件和子目录,但是,当构建映像并运行“某些主机目录”时并且“容器中的代码”目录为空。
当我仅使用 构建 docker 映像时
docker build -t my-dev-image:1.0 .
(使用终端中当前文件夹中的 Dockerfile),然后使用
运行图像docker run -d my-dev-image:1.0
我添加了
CMD ["tail", "-f", "/dev/null"]
以保持容器在运行时保持运行,然后,当我使用 访问正在运行的容器 shell 时,我可以看到容器中可用的“code-in-container”目录
docker exec -it <container_id/bin/sh> /bin/sh
任何人都可以帮助解释当我运行“docker检查
"Mounts": [
{
"Type": "bind",
"Source": "C:\\PathTo\\Host\\Directory\\code-on-host",
"Destination": "/code-in-container",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
但我没有看到对“类型”:“卷”的引用,不确定这是否重要,但希望存在卷引用。
干杯。
我尝试从 Dockerfile 构建镜像并在 Docker Desktop 中运行该镜像,我尝试使用 docker-compose 构建镜像并将镜像目录安装到在 docker-compose 文件中指定为卷的主机目录。一切再次无济于事。我想知道挑战是否是因为图像是在本地构建和使用的,并且它应该位于 docker 图像存储库中并从 docker-compose 文件以这种方式访问。我还尝试使用 Windows Linux 子系统生成映像并使用 docker-compose 文件运行它。