警告:我对对接和云托管相当陌生,这可能是一个愚蠢的问题。
我有一个本地网络应用程序,它有3张与它相关的图像,应用本身,db和phpmyadmin图像。所有文件在本地都运行良好,如果我将所有文件传输到我的数字海洋液滴中,并将我的容器打开,它在那里也能正常工作,但这不是我想部署的方式,我不想让每个库中的每个文件都驻留在我的液滴中。
我一直在尝试在我的液滴上创建一台对接机,并将我的集装箱远程部署到它上。除了我的db映像不引用我的数据库,而且只是一个空的db之外,它似乎工作得很好。我试图以这样的方式迁移db,我在教程中看到了这一点:
docker-compose run --rm web db:create db:migrate但是得到了下面的错误,我猜想这是因为我的dev机器运行的是Windows 10而不是Linux,但是我在任何地方都找不到Windows机器的等效命令。
Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"db:create\": executable file not found in $PATH": unknown我知道我可能错过了一些非常愚蠢和容易的东西,但是我很难找到如何为我的db映像迁移数据。提前谢谢。
更新:根据要求,这里是我的对接者-撰写:
version: "3.4"
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
restart: always
ports:
- 80:80
volumes:
- /sessions
depends_on:
- db
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: mypass
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ./data:/docker-entrypoint-initdb.d
restart: always
web:
depends_on:
- db
build: .
ports:
- "8080:8080"
restart: always
volumes:
data:更新2:将db文件传输到/docker-entrypoint-initdb.d (我昨天也尝试过,但无法使它工作),并创建了一个新的产品对接器-复合-prod.yml,但由于DB仍然是空的,我肯定还缺少了什么东西。下面是我的新船坞-合成-产品. new:
version: "3.4"
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
restart: always
ports:
- 80:80
volumes:
- /sessions
depends_on:
- db
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: mypass
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- /docker-entrypoint-initdb.d
restart: always
web:
depends_on:
- db
build: .
ports:
- "8080:8080"
restart: always发布于 2020-02-18 04:27:07
你的策略很好。
实际上,您还可以进一步自动化液滴配置,例如使用面向容器的操作系统并访问您的撰写文件。但这不是个问题-)
我认为您使用Windows并不相关,而且可能没有什么不同;它可能需要一些解决方案,但仅此而已。
挑战是您需要在远程计算机上移动(或重新创建)数据库状态。可以持久化DB状态的方法有几种:容器内(不理想);使用卷挂载(很好)等。
每一个都是“可移动的”,但是如果您可以将您的撰写文件添加到您的问题中,那么我们就可以看到使用的是哪种方法。
坦白地说,我不熟悉你提到的方法,但这并不意味着它是不准确的,我只是不熟悉它。
更新:docker-entrypoint-initdb.d
参见:“初始化MySQL上的新实例”
因此,在从映像创建数据库容器时,将运行该目录中的任何文件来初始化数据库容器。
在撰写文件中,您将主机的./data目录加载到该文件中。该目录可能包含执行您预期初始化的>=1文件。
NB撰写文件末尾的节
volumes: data:看起来是多余的。实际上,您使用的是一个主机挂载目录./data,而不是这个卷。
当您在液滴上运行撰写文件时,这些文件不存在,您需要复制它们。
最简单的方法是使用scp,这提供了两个备选方案:
或者保留data目录:
IP=[DROPLET-IP]
scp -r ./data root@${IP}:/dataNB远程目的地是
/data而不是./data。您需要修改液滴上的撰写文件(!)也是:volumes: - /data:/docker-entrypoint-initdb.d
或将文件直接移动到液滴的/docker-entrypoint-initdb.d
scp -r ./data root@${IP}/docker-entrypointy-initdb.dNB现在没有必要进行卷映射。您可以删除:`volumes: - ./data:/docker-entrypoint-initdb.d`
最新资料: repro (works)
我使用了一个经过调整的docker-compose.yaml,但本质上是一样的:
version: "3.4"
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: mypass
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ${PWD}/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
restart: always
adminer:
image: adminer
restart: always
ports:
- 8080:8080然后mkdir ${PWD}/docker-entrypoint-initdb.d并在其中创建了一个名为freddie.sql的文件
create database if not exists frederik;
use frederik;
create table treats (
TreatID INT NOT NULL AUTO_INCREMENT,
TreatName VARCHAR(255) NOT NULL,
PRIMARY KEY (TreatId));
insert into treats (TreatName)
values
("Dried Salmon"),
("Meatballs");然后是docker-compose rm --force && docker-compose up
我能够浏览管理员UI (:8080)、登录(root\mypass)和浏览数据库frederik

https://stackoverflow.com/questions/60272402
复制相似问题