#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»], прежде чем этот мир заработает