【问题标题】:Docker-compose command doesn't override Dockerfile CMDDocker-compose 命令不会覆盖 Dockerfile CMD
【发布时间】:2020-09-14 11:13:21
【问题描述】:

Docker-compose reference 说:

命令

覆盖默认命令。

我的 Dockerfile

FROM adoptopenjdk/maven-openjdk8

RUN mkdir /config

COPY /src/main/resources/application.properties /config/application.properties
COPY /src/main/resources/logback.xml /config/logback.xml

# copy wait-for-it-sh tool to sync container starting
COPY wait-for-it.sh /
RUN chmod +x /wait-for-it.sh

VOLUME /tmp

ADD target/my-svc-1.jar app.jar

RUN sh -c 'touch /app.jar'

ENV JAVA_OPTS=""

CMD [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

我的 docker-compose.yml 中有趣的部分

version: '3'

services:
  ..
  my-svc:
    container_name: my-svc-container
    build:
      context: ./my-svc-folder
      dockerfile: Dockerfile
    ports:
      - "9100:9100"
      - "5005:5005"
    depends_on:
      - db
    command: ["./wait-for-it.sh", "my-svc-dbserver:3306", "--", "sh", "-c", "java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /app.jar"]
  ...

docker-compose build 的输出:

Building my-svc
Step 1/11 : FROM adoptopenjdk/maven-openjdk8
 ---> b3ad935008a1
Step 2/11 : RUN mkdir /config
 ---> Using cache
 ---> 5db347c13050
Step 3/11 : COPY /src/main/resources/application.properties /config/application.properties
 ---> Using cache
 ---> ade3653a018a
Step 4/11 : COPY /src/main/resources/logback.xml /config/logback.xml
 ---> Using cache
 ---> 94277fd95be1
Step 5/11 : COPY wait-for-it.sh /
 ---> Using cache
 ---> 80ac64c7c994
Step 6/11 : RUN chmod +x /wait-for-it.sh
 ---> Using cache
 ---> 1a0c99bc10ad
Step 7/11 : VOLUME /tmp
 ---> Using cache
 ---> 81864f3c9fda
Step 8/11 : ADD target/my-svc-1.jar app.jar
 ---> Using cache
 ---> 56cc5c149e37
Step 9/11 : RUN sh -c 'touch /app.jar'
 ---> Using cache
 ---> 9db3f5d983cc
Step 10/11 : ENV JAVA_OPTS=""
 ---> Using cache
 ---> a5c4828b6539
Step 11/11 : CMD [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
 ---> Using cache
 ---> cb1fd876d8d6
Successfully built cb1fd876d8d6
Successfully tagged src_my-svc:latest

所以,最后一步显示为 CMD [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ],Dockerfile 中的那个,而不是 docker-compose 中的那个。

我在这里错过了什么?

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    覆盖发生在运行时,即当你 create 一个基于 image 的容器,然后你 start 它时。您看到的最后一步是在实际image 的building 阶段,它(正确地)遵循Dockerfile 的说明。

    因此,如果您继续使用docker-compose up,将创建和启动的容器将具有docker-compose.yaml 文件中提供的“覆盖”配置。


    来自Overriding Dockerfile image defaults

    覆盖 Dockerfile 映像默认值

    当开发者从Dockerfile 构建镜像或提交镜像时,开发者可以设置一些默认参数,这些参数会在镜像作为容器启动时生效。 四个 Dockerfile 命令在运行时不能被覆盖:FROM、MAINTAINER、RUN 和 ADD。 其他所有内容在docker run 中都有相应的覆盖。

    【讨论】:

    • 你是 100% 正确的。它有效。但我可以发誓我已经构建和运行了 20 次该死的东西,但它没有工作,它只是使用了 Dockerfile 中的 CMD。现在它正在工作。嗯……
    • 有很多“陷阱”,我有时也会感到困惑。很高兴它成功了!
    • 重要,我发现我必须把 COMMAND-FULL-PATH,即命令: ["/usr/local/bin/redis-server", "arg1", "arg2"] 放在前面这个世界工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2019-03-14
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多