docker-compose 中的 command/CMD 不等同于 Dockerfile 中的 CMD

Not*_*bby 5 docker docker-compose

我有一个在其入口点使用卷的容器。例如

CMD bash /some/volume/bash_script.sh
Run Code Online (Sandbox Code Playgroud)

我将其移动到 compose 但它仅在我的 compose 指向该build部分中的 Dockerfile 时才有效,如果我尝试在该部分中编写相同的行command未按我的预期运行并引发文件未找到错误。

我也尝试使用docker-compose run <specific service> bash /some/volume/bash_script.shwhich 给了我同样的错误。

问题是 - 为什么在执行 docker-compose 'command' 时我没有这个卷?有没有办法让这个工作/覆盖我的dockerfile中的CMD?

编辑:我将在我的文件中具体展示我是如何做到这一点的:

码头工人组成:

version: '3'
services:
  base:
    build: 
      context: ..
      dockerfile: BaseDockerfile
    volumes:
      code:/volumes/code/
  my_service:
    volumes:
      code:/volumes/code/
    container_name: my_service
    image: my_service_image
    ports:
      - 1337:1337
    build: 
      context: ..
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

卷: 代码:

基础Dockerfile:

FROM python:3.6-slim

WORKDIR /volumes/code/

COPY code.py code.py
CMD tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python:3.6-slim

RUN apt-get update && apt-get install -y redis-server \
alien \
unixodbc 

WORKDIR /volumes/code/


CMD python code.py;
Run Code Online (Sandbox Code Playgroud)

这有效。

但是,如果我尝试将这一行添加到 docker-compose.yml:

command: python code.py
Run Code Online (Sandbox Code Playgroud)

那么这个文件在命令时不存在。我期待这与 CMD 命令的行为相同

Emr*_*ich 11

嗯,好点!
command: python code.py不完全一样CMD python code.py;
由于第一个被解释为shell 形式的命令,而后者被解释为exec 形式的命令。
问题在于这两种类型的CMD的差异。(即CMD ["something"]vs CMD "something")。
有关这两者的更多信息,请参阅此处

但是,您可能仍然在想您的示例有什么问题?
在您的情况下,根据YAML格式的规范,python code.pycommand: python code.py被解释为单个字符串值,而不是数组!
另一方面,正如您可能已经猜到的那样,python code.py;在上述 Dockerfile 中被解释为一个数组,它提供了一个exec-form命令。