【问题标题】:How to copy files inside container with docker-compose如何使用 docker-compose 复制容器内的文件
【发布时间】:2021-06-16 17:26:46
【问题描述】:

我有一个运行 jar 文件的简单图像。镜像中的那个 jar 文件需要一个特殊的配置文件才能运行。

在 docker-compose.yml 的位置,我有一个名为“carrier”的文件夹,在这个文件夹下我有那个文件。

docker-compose.yml:

version: "3.3"
services:
    web:
        image: "myimage:1.80.0.0"
        ports:
            - "61003:61003"
        volumes:
            - ./carrier:/var/local/Config/
    

当我点击docker-compose up 时,它抱怨该文件不存在,所以它不会复制它。 如果我像在 .sh 命令中那样执行另一个选项,则如下所示:

       volumes:
            - ./carrier:/var/local/Config/:shared

它抱怨另一个错误:

C:\Tasks\2246>docker-compose up
Removing 2246_web_1
Recreating 1fbf5d2bcea4_2246_web_1 ... error

ERROR: for 1fbf5d2bcea4_2246_web_1  Cannot start service web: path /host_mnt/c/Tasks/2246/carrier is mounted on / but it is not a shared mount
        

有人可以帮帮我吗?

【问题讨论】:

  • 请添加您收到的确切错误消息! 当我点击docker-compose up 时,它会抱怨该文件不存在:即docker-compose 是否抱怨或您的应用 正在运行的容器中?它实际上是在抱怨文件/目录 不存在 还是无法访问 - 即也可能是由于权限错误等原因?

标签: docker docker-compose docker-volume docker-container docker-image


【解决方案1】:

删除最后一个/

volumes:
  - ./carrier:/var/local/Config

【讨论】:

  • 也不起作用。它不会复制 /carrier 下的配置文件。 :(
  • 虽然我尝试使用不同的图像,它不会抱怨文件并且它被复制到该位置。不知道为什么我的应用程序抱怨缺少文件。
【解决方案2】:

如果不复制,可以使用Dockerfile。

Dockerfile;

FROM image

COPY files /var/local/Config/

EXPOSE 61003

Docker-compose;

version: "3.3"
services:
    web:
        build: . (path contains Dockerfile)
        ports:
            - "61003:61003"
        volumes:
            - ./carrier:/var/local/Config/

【讨论】:

    【解决方案3】:

    我不确定,但您可以尝试将所有用户的完全访问权限设置为 /carrier:

    chmod -R 777 /carrier
    

    【讨论】:

      【解决方案4】:

      感谢大家的所有回答。 似乎最后 docker 在构建映像时警告我对 Windows 文件与 Linux 文件进行了一些比较。 (不是使用 docker compose,而是使用 Dockerfile)。

      SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
      

      在 linux 上试过了,可以用。

      【讨论】:

        【解决方案5】:

        使用 Dockerfile 复制文件,在下面使用;

        FROM myimage:1.80.0.0
        RUN mkdir -p /var/local/Config/
        COPY carrier /var/local/Config/
        EXPOSE 61003
        

        docker-compose.yml

        version: "3.3"
        services:
          web:
            build:
              dockerfile: Dockerfile
              context: '.'
           ports:
            - "61003:61003"
        

        最后,运行以下命令构建新镜像并启动容器

        • docker-compose up -d --build

        【讨论】:

          猜你喜欢
          • 2022-01-04
          • 2018-04-01
          • 2022-11-13
          • 2018-05-26
          • 2020-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多