我可能错过了一些东西。所以,我已经在生产服务器上安装了 docker,并且我在本地有一个正在运行的应用程序。它在 docker-compose 上启动并运行。
所以我觉得我几乎准备好部署了。
不,我想构建一个 docker 映像并将其部署到生产服务器。
但是当我尝试从 docker compose 文件构建图像时
docker-compose -f docker-compose.base.yml -f docker-compose.production.yml build myapp
我不断收到错误:没有这样的服务:应用
我在 docker 站点上没有找到任何文档,其中描述了来自多个 Dock-compose 文件的映像构建过程。也许它就在那里,但后来我错过了。
我的另一个问题,即问题是:我将图像 tar(.gz) 文件放在目标服务器上的什么位置。
我可以在 /etc/docker/daemon.json 或其他配置文件中指定图像的目标位置吗?
我只是不知道将图像文件转储到生产服务器的何处。
同样,也许 docker 网站上有一些文档。但如果是这样,那我也错过了。
附录源文件
我被要求添加我的 docker-compose 文件以提供一个运行示例。所以,这里是开发和生产环境的完整代码。
为了简单起见,我让这个例子非常基础:
Dockerfile.base
# joint settings for development, production and staging
FROM mariadb:10.3
Dockerfile.production
# syntax = edrevo/dockerfile-plus
INCLUDE+ Dockerfile.base
# add more production specific settings when needed
Dockerfile.development
# syntax = edrevo/dockerfile-plus
INCLUDE+ Dockerfile.base
# add more production specific settings when needed
docker-compose.base.yml
version: "3.8"
services:
mariadb:
container_name: my_mariadb
build:
context: .
volumes:
- ./../../databases/mysql-my:/var/lib/mysql
- ~/.ssh:/root/.ssh
logging:
driver: local
ports:
- "3306:3306"
restart: on-failure
networks:
- backend
networks:
backend:
driver: $DOCKER_NETWORKS_DRIVER
docker-compose.production.yml
services:
mariadb:
build:
dockerfile: Dockerfile.production
environment:
PRODUCTION: "true"
DEBUG: "true"
MYSQL_ROOT_PASSWORD: $DBPASSWORD_PRODUCTION
MYSQL_DATABASE: $DBNAME_PRODUCTION
MYSQL_USER: $DBUSER_PRODUCTION
MYSQL_PASSWORD: $DBPASSWORD_PRODUCTION
docker-compose.development.yml
services:
mariadb:
build:
dockerfile: Dockerfile.development
environment:
DEVELOPMENT: "true"
INFO: "true"
MYSQL_ROOT_PASSWORD: $DBPASSWORD_DEVELOPMENT
MYSQL_DATABASE: $DBNAME_DEVELOPMENT
MYSQL_USER: $DBUSER_DEVELOPMENT
MYSQL_PASSWORD: $DBPASSWORD_DEVELOPMENT
运行时在我的开发机器上正常启动:
docker-compose -f docker-compose.base.yml \
-f docker-compose.development.yml \
up
但是我如何从这里到那里,即我怎样才能把它变成我可以上传到我的 docker 生产主机的自包含图像?
我应该把它放在服务器的什么地方,以便 docker 生产服务器可以找到它?
我认为我应该能够上传和运行构建的映像而无需在生产主机上再次运行 compose,或者我不应该吗?
就目前而言,问题仍然存在:
为什么这个构建命令
docker-compose -f docker-compose.base.yml \
-f docker-compose.production.yml \
build app
return ERROR: No such service: app?
答案 0 :(得分:0)
我在您的问题中看到两个不同的问题:
要在生产服务器上“部署”/启动一个新映像,它需要使用 docker pull
从使用 docker push
上传的注册表下载 - 即您需要 可从生产服务器和您的构建环境访问的注册表。
如果您不想使用注册表(公共或私有),您可以使用 docker export
将图像导出为 tar-ball,您可以手动将其上传到生产服务器并使用 { {3}}。
检查 docker import
以查看您的主机上是否有特定图像可用。
但在您的情况下,我认为将您的 docker-compose.yml
和相关文件上传到生产服务器并直接在那里构建图像是最简单的。
docker-compose -f docker-compose.base.yml \
-f docker-compose.production.yml \
build app
因为没有服务app
!至少在您在问题中提供的文件中,只定义了 mariadb
服务,没有定义 app
服务。
但是在本地开发主机和生产服务器上启动/构建服务应该是相同的。