我使用docker-compose进行开发。在这个过程中,我经常需要构建5个容器(1个用于web服务器,4个用于postgres,redis,mongo等)。 Web服务器容器配置为包含其他容器的链接,它具有自己的ENV vars,从开发主机安装的卷。
问题是我不需要Web容器来运行服务器本身。在创建所有相关容器之后,我需要在web容器内执行/etc/bash
-it
个选项。这就是为什么,我的web容器的dockerfile结束于:
CMD /bin/true
显然,这样的容器不会运行,所以我不能使用smth
docker exec -it <CONTAINER ID> /bin/bash
to&#34;输入&#34;它并运行node app.js
或其他一些任务。
使用compose作为docker-compose.yml
文件的一部分构建容器的任何方法,但稍后使用-it选项运行/ etc / bash?
docker run \
--link postgres
--link ...
-e "NODE_ENV=development" \
-e ... \
...
...
..
但是在这种情况下,我需要在每次开发应用程序时附加所有链接,环境变量,卷等等。
答案 0 :(得分:12)
看起来docker-compose run
会成为你的朋友。来自docker compose docs:
对服务运行一次性命令。例如,以下命令启动Web服务并将bash作为其命令运行。
$ 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
中覆盖此图片。