我正在使用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”目录中?
答案 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容器可以在不影响主机的情况下将所需的内容写入这些文件。