在Docker中,如何从本地目录复制文件,以便可以将这些文件复制到Docker容器中?

时间:2020-07-21 14:09:59

标签: docker docker-compose copy dockerfile

我正在使用Docker

Docker version 19.03.8, build afacb8b

我有以下docker-compose.yml文件...

version: "3.2"
services:

  sql-server-db:
    build: ./
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "Password1!"
      ACCEPT_EULA: "Y"

这是它用来构建的Docker文件...

FROM microsoft/mssql-server-linux:latest
  
# Create work directory
RUN mkdir -p /usr/work

WORKDIR /usr/work

# Copy all scripts into working directory
COPY . /usr/work/

# Grant permissions for the import-data script to be executable
RUN chmod +x /usr/work/import-data.sh

EXPOSE 1433

CMD /bin/bash ./entrypoint.sh

在我的本地计算机上,我在“ ../../scripts/myproject/*.sql”目录中有一些文件(“ ..”相对于我的docker-compose.yml文件所在的目录已存储)。有什么方法可以运行“ docker-compose up”并将这些文件复制到目录中,然后可以从中复制文件到容器的“ / usr / work”目录中?

1 个答案:

答案 0 :(得分:1)

有两种解决方法,一种比另一种更容易,但是都有用例。

简便方法

您可以通过docker-compose将目录直接安装到容器,如下所示:

version: "3.2"
services:

  sql-server-db:
    build: ./
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "Password1!"
      ACCEPT_EULA: "Y"
    volumes:
      - ../../scripts/myproject:/path/to/dir

请注意,与问题中的Yaml相比,添加了volumes。这会将myproject目录安装到容器内的/path/to/dir。这也意味着,如果sql-server-db容器写入/path/to/dir中的任何文件,则主机上myproject中的文件也会更改,因为已挂载了文件

不太容易的方法

您可以在映像构建期间直接复制文件。这有点难,因为docker的构建阶段不允许复制父目录,除非您添加一些额外的参数。需要发生的是,将构建阶段的context设置为与当前目录不同的目录。 context确定将哪些文件发送到构建阶段。该目录与Dockerfile的默认目录相同。

要采用这种方法,您需要在docker-compose.yml中添加以下内容:

version: "3.2"
services:

  sql-server-db:
    build:
      context: ../..
      dockerfile: path/to/Dockerfile # Here you should specify the path to your Dockerfile, this is a relative path from your context
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "Password1!"
      ACCEPT_EULA: "Y"

因此context上方现在是../..,因此您可以将文件复制到上面的两个目录中。然后,您可以像这样在Dockerfile中复制myproject目录:

FROM microsoft/mssql-server-linux:latest

COPY ./scripts/myproject /myfiles

这种方法的优点是复制文件而不是挂载文件,因此docker容器可以在不影响主机的情况下将所需的内容写入这些文件。