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

标签 docker docker-compose

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

CMD bash /some/volume/bash_script.sh

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

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

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

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

docker 组成:
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

卷:
代码:

基础Dockerfile:
FROM python:3.6-slim

WORKDIR /volumes/code/

COPY code.py code.py
CMD tail -f /dev/null

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;

这有效。

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

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

最佳答案

嗯,好点!command: python code.pyCMD python code.py; 不完全相同!
由于第一个被解释为 shell 形命令,后者被解释为 执行表格 命令。
问题在于这两种类型的 CMD 之间的差异。 (即 CMD ["something"]CMD "something" )。
有关这两个的更多信息,请参阅 here .

但是,您可能仍在思考您的示例有什么问题?
在您的情况下,基于 YAML 格式的规范,python code.pycommand: python code.py将被解释为单个字符串值,而不是数组!
另一方面,正如您可能已经猜到的,python code.py;在上面提到的Dockerfile中被解释为一个数组,它提供了一个执行表格 命令。

关于docker - docker-compose 中的 command/CMD 不等同于 Dockerfile 中的 CMD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53803006/

相关文章:

docker - 在 docker-compose.yml 卷中声明为部分和在服务下有什么区别?

java - 构建java项目的docker镜像时如何连接到Nexus并下载jar文件作为依赖

docker - 构建 docker 环境从 Virtualbox 迁移,网络配置复杂

bash - 如何在启动时动态地将docker容器ip设置为环境变量?

Docker 自动更改 URL 中的端口

docker - 如何使用初始键值对数据在 docker 上运行 Consul?

docker - 当主机不正常关闭时,docker 容器中的文件会发生什么?

c# - Docker抛出异常,因为无法解析远程名称

docker - 为什么我无法连接到 docker 中的 postgres?

Docker VS 代码移除 devcontainer