我想这样做,我可以在下面的代码中运行多个命令:

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

如何执行多个命令?


当前回答

这对我有用:

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

dockercompose尝试在运行命令之前取消对变量的引用,因此如果您希望bash处理变量,则需要通过加倍它们来逃避美元符号。。。

    command:
      - /bin/bash
      - -c
      - |
        var=$$(echo 'foo')
        echo $$var # prints foo

…否则会出现错误:

服务“web”中“命令”选项的插值格式无效:

其他回答

想好了,使用bash-c。

例子:

command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"

多行中的相同示例:

command: >
    bash -c "python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000"

Or:

command: bash -c "
    python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000
  "

如果其他人试图使用基于Windows的容器计算多个命令,则以下格式有效:命令:“cmd.exe/c调用c:\Temp/script1.bat&&dir&&c:/Temp/script2.bat&&…”

包括“呼叫”指令是我修复它的原因。

或者,如果每个命令都可以在没有前面命令的情况下执行,则只需用分号分隔每个命令:命令:“cmd.exe/c调用c:\Temp/script1.bat;dir;c:\Temp/sscript2.bat;…”

我在尝试将jenkins容器设置为作为jenkins用户构建docker容器时遇到了这个问题。

我需要触摸Dockerfile中的docker.sock文件,因为我稍后将其链接到docker-compose文件中。除非我先接触它,否则它还不存在。这对我有用。

Dockerfile文件:

USER root
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; 
echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
RUN groupmod -g 492 docker && \
usermod -aG docker jenkins  && \
touch /var/run/docker.sock && \
chmod 777 /var/run/docker.sock

USER Jenkins

docker-compose.yml文件:

version: '3.3'
services:
jenkins_pipeline:
    build: .
    ports:
      - "8083:8083"
      - "50083:50080"
    volumes:
        - /root/pipeline/jenkins/mount_point_home:/var/jenkins_home
        - /var/run/docker.sock:/var/run/docker.sock

我建议使用sh而不是bash,因为它在大多数基于Unix的映像(alpine等)上更容易使用。

下面是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"

这将按顺序调用以下命令:

python manage.py wait_for_db-等待数据库准备就绪python manage.py migrate-运行任何迁移python manage.py runserver 0.0.0.0:8000-启动我的开发服务器

最干净?

---
version: "2"
services:
  test:
    image: alpine
    entrypoint: ["/bin/sh","-c"]
    command:
    - |
       echo a
       echo b
       echo c