Dockerfile将文件复制到正确的容器中

Dockerfile将文件复制到正确的容器中,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有两个码头集装箱。一个运行tomcat,另一个运行mysql。我想将.sql文件复制到mysql容器已经存在的“docker entrypoint initdb.d”文件夹中 我在Dockerfile中使用了以下命令: COPY test.sql /docker-entrypoint-initdb.d 两个容器启动后,我看到在我的tomcat容器中创建了文件夹“docker entrypoint initdb.d”,并将test.sql复制到其中。 文件没有复制到我需要的地方test.sql

我有两个码头集装箱。一个运行tomcat,另一个运行mysql。我想将
.sql
文件复制到mysql容器已经存在的“docker entrypoint initdb.d”文件夹中

我在Dockerfile中使用了以下命令:

COPY test.sql /docker-entrypoint-initdb.d
两个容器启动后,我看到在我的tomcat容器中创建了文件夹“docker entrypoint initdb.d”,并将
test.sql
复制到其中。 文件没有复制到我需要的地方
test.sql
未复制到mysql容器中

我能做什么

docker-compose.xml:

version: "2"

services:
    db: 
        image: mysql
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD="true"

    myapp:
        build: ./myapp
        ports:
            - 8080:8080
            - 3306:3306

您正在构建
tomcat
容器,但是在那里使用了
Mysql
图像,这就是文件复制到
tomcat
容器的原因

当容器打开时,您可以
docker cp
手动将文件移动到所需位置

如果您想让数据库在启动时可用于容器,我建议您使用一个挂载了本地文件系统的虚拟容器。然后在该容器中手动恢复数据库。然后移除容器并修改dockerfile,如下所示:

version: "2"

services:
    db: 
        image: mysql
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD="true"
        volumes:
          - /my/own/datadir:/var/lib/mysql

    myapp:
        build: ./myapp
        ports:
            - 8080:8080
            - 3306:3306
FROM mysql
COPY test.sql /docker-entrypoint-initdb.d
另一种方法是使用以下
dockerfile
创建自己的图像:

FROM mysql
COPY test.sql /docker-entrypoint-initdb.d

您正在构建
tomcat
容器,但是在那里使用了
Mysql
图像,这就是文件复制到
tomcat
容器的原因

当容器打开时,您可以
docker cp
手动将文件移动到所需位置

如果您想让数据库在启动时可用于容器,我建议您使用一个挂载了本地文件系统的虚拟容器。然后在该容器中手动恢复数据库。然后移除容器并修改dockerfile,如下所示:

version: "2"

services:
    db: 
        image: mysql
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD="true"
        volumes:
          - /my/own/datadir:/var/lib/mysql

    myapp:
        build: ./myapp
        ports:
            - 8080:8080
            - 3306:3306
FROM mysql
COPY test.sql /docker-entrypoint-initdb.d
另一种方法是使用以下
dockerfile
创建自己的图像:

FROM mysql
COPY test.sql /docker-entrypoint-initdb.d

使用Dockerfile为数据库容器构建自己的映像,如下所示:

version: "2"

services:
    db: 
        image: mysql
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD="true"
        volumes:
          - /my/own/datadir:/var/lib/mysql

    myapp:
        build: ./myapp
        ports:
            - 8080:8080
            - 3306:3306
FROM mysql
COPY test.sql /docker-entrypoint-initdb.d

使用Dockerfile为数据库容器构建自己的映像,如下所示:

version: "2"

services:
    db: 
        image: mysql
        environment:
            - MYSQL_ALLOW_EMPTY_PASSWORD="true"
        volumes:
          - /my/own/datadir:/var/lib/mysql

    myapp:
        build: ./myapp
        ports:
            - 8080:8080
            - 3306:3306
FROM mysql
COPY test.sql /docker-entrypoint-initdb.d

tomcat容器是通过docker文件构建的,其中as mysql容器(db)是通过docker映像名“mysql”构建的

您可以将具有当前文件夹(主机)的卷装载到容器内的“/docker entrypoint initdb.d”

新的docker-compose.yml将如下所示

version: "2"

services:
  db: 
    image: mysql
    environment:
        - MYSQL_ALLOW_EMPTY_PASSWORD="true"

    volumes:
        - .:/docker-entrypoint-initdb.d
 myapp:
    build: ./myapp
    ports:
        - 8080:8080
        - 3306:3306

tomcat容器是通过docker文件构建的,其中as mysql容器(db)是通过docker映像名“mysql”构建的

您可以将具有当前文件夹(主机)的卷装载到容器内的“/docker entrypoint initdb.d”

新的docker-compose.yml将如下所示

version: "2"

services:
  db: 
    image: mysql
    environment:
        - MYSQL_ALLOW_EMPTY_PASSWORD="true"

    volumes:
        - .:/docker-entrypoint-initdb.d
 myapp:
    build: ./myapp
    ports:
        - 8080:8080
        - 3306:3306

你的集装箱有单独的docker文件,对吗?不,我在一个集装箱里做。我使用docker compose结构。你能发布你的docker compose yaml文件吗?将其添加到我的问题中。你的容器有单独的docker文件,对吗?不,我在一个容器中完成。我使用docker compose结构。你能发布你的docker compose yaml文件吗?将其添加到我的问题中。我知道docker cp,但我想我需要在启动前复制该文件。(我不想在每次启动时都复制它)那么我能具体做些什么来解决我的问题呢?我知道docker cp,但我想我需要在启动前复制文件。(我不想在每次创业时都复制它)那么我能具体做些什么来解决我的问题呢?