Bre*_*len 417 yaml docker docker-compose
我想做这样的事情,我可以按顺序运行多个命令.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
Run Code Online (Sandbox Code Playgroud)
Bre*_*len 729
弄清楚,使用bash -c.
例:
command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
Run Code Online (Sandbox Code Playgroud)
多行中的相同示例:
command: >
bash -c "python manage.py migrate
&& python manage.py runserver 0.0.0.0:8000"
Run Code Online (Sandbox Code Playgroud)
Bjo*_*iel 145
我在一个单独的短暂容器中运行预启动之类的东西,比如这样(注意,compose文件必须是版本'2'类型):
db:
image: postgres
web:
image: app
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
depends_on:
- migration
migration:
build: .
image: app
command: python manage.py migrate
volumes:
- .:/code
links:
- db
depends_on:
- db
Run Code Online (Sandbox Code Playgroud)
这有助于保持清洁和分离.需要考虑的两件事:
您必须确保正确的启动顺序(使用depends_on)
你想避免多次构建,这是通过使用构建和图像第一次标记它来实现的; 你可以参考其他容器中的图像
Lon*_*Dev 72
我建议使用sh而不是bash因为它在大多数基于unix的图像(高山等)上更容易获得.
这是一个例子docker-compose.yml:
version: '3'
services:
app:
build:
context: .
command: >
sh -c "python manage.py wait_for_db &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
Run Code Online (Sandbox Code Playgroud)
这将按顺序调用以下命令:
python manage.py wait_for_db - 等待数据库准备就绪python manage.py migrate - 运行任何迁移 python manage.py runserver 0.0.0.0:8000 - 启动我的开发服务器MUH*_*AHA 33
最干净?
---
version: "2"
services:
test:
image: alpine
entrypoint: ["/bin/sh","-c"]
command:
- |
echo a
echo b
echo c
Run Code Online (Sandbox Code Playgroud)
Mat*_*ice 26
这对我有用:
version: '3.1'
services:
db:
image: postgres
web:
build: .
command:
- /bin/bash
- -c
- |
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
Run Code Online (Sandbox Code Playgroud)
docker-compose会在运行命令之前尝试取消引用变量,因此,如果您希望bash处理变量,则需要将它们加倍以避开美元符号...
command:
- /bin/bash
- -c
- |
var=$$(echo 'foo')
echo $$var # prints foo
Run Code Online (Sandbox Code Playgroud)
...否则,您将得到一个错误:
服务“ Web”中“命令”选项的无效插值格式:
Jul*_*ian 23
这个线程中已经有很多很好的答案,但是,我发现其中一些答案的组合似乎效果最好,特别是对于基于 Debian 的用户。
\nservices:\n db:\n . . . \n web:\n . . .\n depends_on:\n - "db"\n command: > \n bash -c "./wait-for-it.sh db:5432 -- python manage.py makemigrations\n && python manage.py migrate\n && python manage.py runserver 0.0.0.0:8000"\nRun Code Online (Sandbox Code Playgroud)\n先决条件:将wait-for-it.sh添加到项目目录中。
\n来自文档的警告:“(在生产中使用 wait-for-it.sh 时),您的数据库可能会变得不可用或随时移动主机......(此解决方案适用于)不需要的人这种程度的恢复能力。”
\n编辑:
\n这是一个很酷的短期修复,但对于长期解决方案,您应该尝试在每个映像的 Dockerfile 中使用入口点。
\nHar*_*ola 21
您可以在此处使用入口点.docker中的入口点在命令之前执行,而while命令是容器启动时应该运行的默认命令.因此,大多数应用程序通常在入口点文件中携带设置过程,最后它们允许命令运行.
make shell脚本文件可以是docker-entrypoint.sh(名称无关紧要),其中包含以下内容.
#!/bin/bash
python manage.py migrate
exec "$@"
Run Code Online (Sandbox Code Playgroud)
在docker-compose.yml文件中使用它entrypoint: /docker-entrypoint.sh并将命令注册为command: python manage.py runserver 0.0.0.0:8000
PS:不要忘记docker-entrypoint.sh随你的代码一起复制.
Gtd*_*Dev 12
这是我对这个问题的解决方案:
services:
mongo1:
container_name: mongo1
image: mongo:4.4.4
restart: always
# OPTION 01:
# command: >
# bash -c "chmod +x /scripts/rs-init.sh
# && sh /scripts/rs-init.sh"
# OPTION 02:
entrypoint: [ "bash", "-c", "chmod +x /scripts/rs-init.sh && sh /scripts/rs-init.sh"]
ports:
- "9042:9042"
networks:
- mongo-cluster
volumes:
- ~/mongors/data1:/data/db
- ./rs-init.sh:/scripts/rs-init.sh
- api_vol:/data/db
environment:
*env-vars
depends_on:
- mongo2
- mongo3
Run Code Online (Sandbox Code Playgroud)
小智 11
要使用 .docker-compose 文件在 docker-compose 文件中运行多个命令bash -c。
command: >
bash -c "python manage.py makemigrations
&& python manage.py migrate
&& python manage.py runserver 0.0.0.0:8000"
Run Code Online (Sandbox Code Playgroud)
资料来源:https : //intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
基于 Alpine 的图像实际上似乎没有安装 bash,但您可以使用shor ashwhich 链接到/bin/busybox.
示例docker-compose.yml:
version: "3"
services:
api:
restart: unless-stopped
command: ash -c "flask models init && flask run"
Run Code Online (Sandbox Code Playgroud)
如果您需要运行多个守护进程,Docker 文档中建议在非分离模式下使用 Supervisord,以便所有子守护进程都将输出到 stdout。
从另一个 SO 问题中,我发现您可以将子进程输出重定向到标准输出。 这样你就可以看到所有的输出了!
*更新*
我认为运行某些命令的最佳方法是编写一个自定义Dockerfile,该文件可以在从映像运行官方CMD之前完成我想要的一切。
docker-compose.yaml:
version: '3'
# Can be used as an alternative to VBox/Vagrant
services:
mongo:
container_name: mongo
image: mongo
build:
context: .
dockerfile: deploy/local/Dockerfile.mongo
ports:
- "27017:27017"
volumes:
- ../.data/mongodb:/data/db
Run Code Online (Sandbox Code Playgroud)
Dockerfile.mongo:
FROM mongo:3.2.12
RUN mkdir -p /fixtures
COPY ./fixtures /fixtures
RUN (mongod --fork --syslog && \
mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection videos --file /fixtures/videos.json)
Run Code Online (Sandbox Code Playgroud)
这可能是最干净的方法。
*旧方式*
我用命令创建了一个shell脚本。在这种情况下,我想启动mongod并运行,mongoimport但调用会mongod阻止您运行其余部分。
docker-compose.yaml:
version: '3'
services:
mongo:
container_name: mongo
image: mongo:3.2.12
ports:
- "27017:27017"
volumes:
- ./fixtures:/fixtures
- ./deploy:/deploy
- ../.data/mongodb:/data/db
command: sh /deploy/local/start_mongod.sh
Run Code Online (Sandbox Code Playgroud)
start_mongod.sh:
mongod --fork --syslog && \
mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection videos --file /fixtures/videos.json && \
pkill -f mongod && \
sleep 2 && \
mongod
Run Code Online (Sandbox Code Playgroud)
因此,这会分叉mongo,进行monogimport,然后杀死分离的分叉mongo,然后在不分离的情况下再次启动它。不知道是否有一种方法可以附加到派生的进程上,但这确实可行。
注意:如果您严格要加载一些初始数据库数据,这是这样做的方法:
mongo_import.sh
#!/bin/bash
# Import from fixtures
# Used in build and docker-compose mongo (different dirs)
DIRECTORY=../deploy/local/mongo_fixtures
if [[ -d "/fixtures" ]]; then
DIRECTORY=/fixtures
fi
echo ${DIRECTORY}
mongoimport --db wcm-local --collection clients --file ${DIRECTORY}/clients.json && \
mongoimport --db wcm-local --collection configs --file ${DIRECTORY}/configs.json && \
mongoimport --db wcm-local --collection content --file ${DIRECTORY}/content.json && \
mongoimport --db wcm-local --collection licenses --file ${DIRECTORY}/licenses.json && \
mongoimport --db wcm-local --collection lists --file ${DIRECTORY}/lists.json && \
mongoimport --db wcm-local --collection properties --file ${DIRECTORY}/properties.json && \
mongoimport --db wcm-local --collection videos --file ${DIRECTORY}/videos.json
Run Code Online (Sandbox Code Playgroud)
mongo_fixtures / *。json文件是通过mongoexport命令创建的。
docker-compose.yaml
version: '3'
services:
mongo:
container_name: mongo
image: mongo:3.2.12
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db:cached
- ./deploy/local/mongo_fixtures:/fixtures
- ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh
volumes:
mongo-data:
driver: local
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
325566 次 |
| 最近记录: |