【问题标题】:Docker volume not being mounted in containerDocker 卷未安装在容器中
【发布时间】:2020-12-05 06:13:09
【问题描述】:

我正在尝试使用 docker-compose 安装一个卷,以便在开发时可以热重载一些 C 代码。我之前使用过 Docker 几次,并且在处理 nodejs 网站时专门遇到了这个用例,但我在这里完全不知所措。

我的docker-compose.ymlDockerfile 已被完全剥离到最低限度。我想将当前目录(所有源代码)挂载到容器中。我的Dockerfile 只是安装了一些依赖项,设置了工作目录,然后在我的docker-compose.yml 添加卷时尝试运行makefile。结果是一个容器无法访问已安装的卷和生成的代码(Makefile 没有任何问题,因为它在主机目录上工作并且在复制时,而不是使用卷)。有没有人发现这两个文件有什么问题?看来/cfs 文件夹甚至没有在容器中创建。我尝试将其挂载到主目录无济于事。

docker-compose.yml

version: '3'

services:
  cfs:
    volumes:
      - ./:/cfs
    build:
        context: ./
        dockerfile: ./Dockerfile
    networks:
      - default
  
networks:
  default:
    internal: true    

Dockerfile

FROM ubuntu:20.04

# install dependencies
RUN apt-get -qy update                           \
    && apt-get -y install                        \
        cmake=3.16.3-1ubuntu1                    \
        make=4.2.1-1.2                           \
        gcc=4:9.3.0-1ubuntu2                     \
        g++=4:9.3.0-1ubuntu2

WORKDIR /cfs

RUN make prep
RUN make
RUN make install

【问题讨论】:

  • 看起来应该可以。作为分析此问题的第一步,您可能希望在卷定义中将 ./ 替换为 ${PWD} 以查看是否有所不同。在某些环境中 ./ 和 ${PWD} 返回不同的值。

标签: docker docker-compose dockerfile


【解决方案1】:

大多数 Compose 设置在映像构建期间不可见。 volumes: 未安装,environment: 变量未设置,networks: 不可访问。只有直接 build: 块中的设置才有效。

这意味着您应该单独查看 Dockerfile,忽略 docker-compose.yml 文件。此时,/cfs 目录是空的(您没有在其中添加任何源代码COPY),因此RUN make ... 命令将失败。目录最终会挂载其他东西并不重要。

如果您只是打算在源代码更改时重新编译应用程序,请将 volumes:COPY 源删除到映像中,然后在您通常运行 make 的位置运行 docker-compose build .如果您确实有一个可以在源更改时重建应用程序的设置,则需要设置图像的CMD 来启动它,但如果您没有COPY 源,则无法在图像中构建它建造时间。 (......如果你要用一个卷覆盖图像的整个有趣内容,无论如何它都会丢失。)

【讨论】:

  • OP 特别提到在开发过程中需要热重载。所以他们确实需要 Dockerfile COPY 步骤来处理初始构建,并且他们需要保留卷:mount。
  • 所以我想我应该将所有 make 命令包装在一个 filewatcher 脚本中,该脚本会根据需要运行它们并将其作为入口点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多