Команда Docker-compose не переопределяет Dockerfile CMD

#docker #docker-compose #dockerfile

#docker #docker-compose #dockerfile

Вопрос:

Ссылка на Docker-compose гласит:

команда

Переопределите команду по умолчанию.

Мой 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:

 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.

Чего мне здесь не хватает?

Ответ №1:

Переопределение происходит во время выполнения, то есть когда вы create создаете контейнер на основе image , а затем start его. Этот последний шаг, который вы видите, находится на building этапе фактического image выполнения, который (правильно) следует инструкциям вашего Dockerfile .

Итак, если вы продолжите docker-compose up , контейнер, который будет создан и запущен, будет иметь «переопределенную» конфигурацию, указанную в docker-compose.yaml файле.


Из переопределения настроек изображения Dockerfile по умолчанию

Переопределение настроек образа Dockerfile по умолчанию

Когда разработчик создает изображение из Dockerfile или когда он его фиксирует, разработчик может установить ряд параметров по умолчанию, которые вступают в силу при запуске изображения в качестве контейнера. Четыре команды Dockerfile не могут быть переопределены во время выполнения: FROM , MAINTAINER , RUN и ADD . Все остальное имеет соответствующее переопределение в docker run .

Комментарии:

1. Вы на 100% правы. И это работает. Но я мог бы поклясться, что я создавал И запускал эту чертову штуку 20 раз, и это не сработало, он просто использовал CMD из Dockerfile. И теперь это работает. Хм…

2. Есть много «подводных камней», и я тоже иногда путаюсь. Рад, что это сработало!

3. ВАЖНО, я обнаружил, что мне пришлось ввести команду с ПОЛНЫМ ПУТЕМ, т.Е. команду: [«/ usr / local /bin / redis-server», «arg1», «arg2»], прежде чем этот мир заработает