【问题标题】:Docker compose, difference between command: and command: - [duplicate]Docker compose,命令之间的区别:和命令:-[重复]
【发布时间】:2021-09-12 11:14:05
【问题描述】:

我一直试图在我的 docker compose 文件中理解 command: 和 command:- 之间的区别:

这是我的 dockerfile:

ENV PYTHONUNBUFFERED=1
COPY requirements.txt .
COPY dbenv .
RUN python3 -m pip install pymysql
RUN pip install mysql-connector-python
RUN pip install openpyxl
RUN pip install lxml
RUN pip install -r requirements.txt
RUN pip install pandas
RUN pip install requests
RUN pip install beautifulsoup4
COPY . .
WORKDIR /MY_DATABASE

这是我的 docker compose 文件:

version: '3.6'

services:

  db:
    image: mysql:latest
    environment: 
      - MYSQL_ROOT_PASSWORD=postgres
      - MYSQL_DATABASE=webscrape
      - MYSQL_USER=django
      - MYSQL_PASSWORD=djangodb
    ports: 
      - 3306:3306
    restart: always
    # cap_add:
    #   - SYS_NICE

  scraper:
    build:
      context: .
      dockerfile: dockerfile
    environment: 
      - MYSQL_ROOT_PASSWORD=postgres
      - MYSQL_DATABASE=webscrape
      - MYSQL_USER=django
      - MYSQL_PASSWORD=djangodb
      - MYSQL_PORT=3306
      - MYSQL_HOST=db
    # working_dir: /MY_DATABASE

    restart: always
    depends_on: 
      - db
    # command: python Security_table/initialize_securities_table.py
    working_dir: /MY_DATABASE
    command: 
      - python Security_table/initialize_securities_table.py

现在如果注释最后 2 行,我取消注释最后 3 行,如下所示

command: python Security_table/initialize_securities_table.py

一切都会按预期进行。但是如果我尝试把它放在一个列表格式中,它就行不通了。

command: 
  - python Security_table/initialize_securities_table.py

它会告诉“没有这样的文件或目录:未知”

我在这里缺少什么?

【问题讨论】:

  • 如果你想以列表的形式提供你的命令,你的命令行的每个元素都需要在自己的项目中:command: ['python', 'Security_table/initialize_securities_table.py']docs.docker.com/compose/compose-file/compose-file-v3/#command
  • 这基本上是一个关于 YAML 语法的问题。如果您的command 是一个列表,则它应该是每个项目一个token,而不是每个项目一个命令(类似于DockerfileCMD python file.pyCMD ["python", "file.py"] 之间的区别。跨度>

标签: docker docker-compose


【解决方案1】:

您尝试过的语法将用于多个命令,这不是它的目标。

(1 个入口点,1 个命令)

https://docs.docker.com/compose/compose-file/compose-file-v3/#command

你可以这样写

command: python Security_table/initialize_securities_table.py

或:

command: ["python", "Security_table/initialize_securities_table.py"]

如果你想运行多个命令(bash 脚本示例)

command: ["/bin/bash", "/path/to/script/with/multiple/commands"]

当你运行一个 docker 镜像时,例如:

docker run -it debian:10 /bin/bash

/bin/bash是命令部分。

【讨论】: