关于boot2docker:使用docker-compose构建容器,但稍后使用-it选项运行/ etc / bash吗?

Build container with docker-compose, but run /etc/bash with -it option later?

我正在使用docker-compose进行开发。在此过程中,我经常需要构建5个容器(1个用于Web服务器,4个用于postgres,redis,mongo等)。 Web服务器容器被配置为包括其他容器的链接,它具有其自己的ENV变量,从开发主机安装的卷。

问题是我不需要Web容器来运行服务器本身。代替此,在创建所有依赖容器之后,我需要在Web容器内使用-it选项执行/etc/bash。这就是为什么,我的用于Web容器的dockerfile结尾为:

1
CMD /bin/true

很明显,这样的容器不会运行,所以我不能使用像

1
docker exec -it <CONTAINER ID> /bin/bash

将其"输入"并运行node app.js或其他一些任务。

有什么方法可以将compose作为docker-compose.yml文件的一部分来构建容器,但是稍后使用-it选项运行/ etc / bash吗?

顺便说一句,我当然可以使用

手动启动一个单独的Web容器

1
2
3
4
5
6
7
8
docker run \\
--link postgres
--link ...
-e"NODE_ENV=development" \\
-e ... \\
...
...
..

但是在这种情况下,每次我要开发应用程序时,我都需要将所有链接,env vars,卷等附加为参数。


看起来像docker-compose run的人会成为您的朋友。从Docker撰写文档:

Runs a one-time command against a service. For example, the following command starts the web service and runs bash as its command.

$ docker-compose run web bash

命令docker-compose run <service-name>还确保所有必需的容器(例如提供卷和链接的那些容器)(如果尚未运行)将在容器<service-name>之前启动。

如果使用任何端口映射,则可以考虑使用docker-compose run --service-ports <service-name>。如果没有该选项,则docker-compose仅在使用docker-compose up时映射端口。

docker run一样,一旦完成处理,也可以使用--rm选项删除容器。

如果图像使用ENTRYPOINT,则应考虑在docker-compose.yml中将其替换为entrypoint: /bin/bash