Onepiece3610 2024-04-23 10:34 采纳率: 33.3%
浏览 9

docker 数据卷挂载创建容器失败

通过以下命令创建容器,

[root@hecs-132470 nginx01]# docker run -d -p 8080:80 -v /etc/nginx01:/etc/nginx -v /usr/share/nginx01:/usr/share/nginx --name nginx01  92b11f67642b
2655a8e2356352c0dff4838f588e56b324c86d5c2bcabccba89d6e3d45ed9255

加上-v参数挂载数据卷,就会立马是退出状态,不加-v就是正常up状态

[root@hecs-132470 nginx01]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS                                       NAMES
2655a8e23563   92b11f67642b   "/docker-entrypoint.…"   3 minutes ago   Exited (1) 3 minutes ago                                               nginx01

查看了下日志,看着提示/etc/nginx/nginx.conf不存在,

[root@hecs-132470 nginx01]# docker logs 265
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf is not a file or does not exist
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/04/23 02:27:09 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)

但是实际查看容器是有的哇,而且我是挂载整个目录,为啥还会提示里面单独的文件不存在


[root@hecs-132470 nginx01]# docker run -it --rm 92b11f67642b ls /etc/nginx
conf.d    fastcgi_params    mime.types  modules  nginx.conf  scgi_params  uwsgi_params
  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 10:34
    关注

    引自免费微信小程序:皆我百晓生

    看起来你遇到的问题在于试图将本地的 /etc/nginx01/usr/share/nginx01 目录挂载到 Docker 容器中的对应路径,但 Docker 在启动时尝试读取 /etc/nginx/nginx.conf 文件时遇到了问题,因为它在容器内部找不到这个文件。

    尽管你在容器内部手动执行 ls 命令后发现该文件确实存在,这可能是因为在容器启动期间,Docker 的初始化脚本(/docker-entrypoint.sh)运行时没有正确处理挂载的数据卷。为了解决这个问题,你需要确保容器内的初始化脚本能正确识别并处理来自数据卷的配置文件。

    解决方法之一是确保本地的 /etc/nginx01/nginx.conf 文件已经存在于你想要挂载的路径下,并且内容正确无误。同时,确认容器镜像本身并未包含一个默认的 /etc/nginx/nginx.conf 文件,因为这可能会覆盖从数据卷中挂载的配置文件。

    如果你确定本地的配置文件存在并且正确,那么可以尝试修改启动命令,添加额外的参数来强制覆盖容器内已存在的配置文件。在 Docker 镜像的官方文档中,有一个名为 --default-config 的选项可以用来指定一个替代的配置文件。然而,这个选项并不常用,且并非所有镜像都支持。因此,这里提供一种更通用的方法:利用 Dockerfile 中的 COPY 指令替换默认配置文件。

    首先,创建一个简单的 Dockerfile,将本地的 nginx.conf 复制到容器的 /etc/nginx/ 目录中:

    FROM nginx:latest
    
    COPY nginx.conf /etc/nginx/
    

    然后,在当前目录构建一个新的镜像,使用你的 nginx.conf 文件作为基础:

    docker build -t my-custom-nginx .
    

    最后,使用新构建的镜像启动容器:

    docker run -d -p 8080:80 -v /etc/nginx01:/etc/nginx -v /usr/share/nginx01:/usr/share/nginx --name nginx01 my-custom-nginx
    

    这样,Docker 将会使用你提供的 nginx.conf 文件,而不是容器内自带的默认配置。如果仍然存在问题,请检查你的 nginx.conf 文件是否正确无误。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)