Docker run和docker-compose运行结果不同的原因

64次阅读
没有评论

问题描述

在使用Docker时遇到了一个问题,他在容器中复制了一个文件到/root/.guacamole/lib目录,并使用docker commit命令创建了一个新的镜像。通过使用docker run -it --name="name" image bash命令进入容器并执行ls命令,确认文件存在。但是当使用docker-compose启动容器时,尽管使用的是相同的镜像,但文件却丢失了。用户想知道这是为什么。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,可能有以下几个原因导致docker run和docker-compose运行结果不同:
1. 镜像版本不一致:请确保在使用docker commit命令创建镜像时,使用的是相同的版本。可以通过运行docker images命令来查看本地镜像的版本。
2. 镜像推送问题:如果你使用了docker push命令将镜像推送到Docker Hub或其他镜像仓库,请确保推送成功,并且本地和远程的镜像版本一致。
3. docker-compose.yml文件配置问题:在用户提供的docker-compose.yml文件中,没有看到~/.guacamole/lib路径的挂载配置。请确保在docker-compose.yml文件的volumes部分添加正确的挂载路径,以便将宿主机的文件映射到容器中。
以下是一个示例的docker-compose.yml文件,添加了~/.guacamole/lib路径的挂载配置:

version: "2"
services:
  guacd:
    image: "guacamole/guacd"
    container_name: guacd
    hostname: guacd
    restart: always
    volumes:
      - "/data/shared/guacamole/guacd/data:/data"
      - "/data/shared/guacamole/guacd/conf:/conf:ro"
    expose:
      - "4822"
    ports:
      - "4822:4822"
    network_mode: bridge
  guac2:
    image: "guac2"
    container_name: guac2
    hostname: guac2
    restart: always
    volumes:
      - "/data/shared/guacamole/guacamole/guac-home:/data"
      - "/data/shared/guacamole/guacamole/conf:/conf:ro"
      - "~/.guacamole/lib:/root/.guacamole/lib"  # 添加挂载配置
    expose:
      - "8080"
    ports:
      - "8084:8080"
    network_mode: bridge
    environment:
      - "GUACD_HOSTNAME=pc.lan"
      - "GUACD_PORT=4822"
      - "MYSQL_HOSTNAME=pc.lan"
      - "MYSQL_PORT=3306"
      - "MYSQL_DATABASE=guacamole_db"
      - "MYSQL_USER=guacamole_user"
      - "MYSQL_PASSWORD=password"
      - "GUACAMOLE_HOME=/data"

请注意,以上解决方案仅供参考,具体操作步骤可能因环境和配置而有所不同。建议用户根据自己的实际情况进行调整和尝试。

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

示例:

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b
请注意,以上解决方案仅供参考,具体操作步骤可能因环境和配置而有所不同。建议用户根据自己的实际情况进行调整和尝试。

正文完