Docker-Compose를 사용하여 여러 명령을 실행하는 방법
여러 명령을 순서대로 실행할 수있는 이와 같은 작업을 수행하려고합니다.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
알아 낸 다음를 사용하십시오 bash -c
.
예:
command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
여러 줄에서 동일한 예 :
command: >
bash -c "python manage.py migrate
&& python manage.py runserver 0.0.0.0:8000"
또는:
command: bash -c "
python manage.py migrate
&& python manage.py runserver 0.0.0.0:8000
"
별도의 임시 컨테이너에서 마이그레이션과 같은 시작 전 작업을 실행합니다 (작성 파일은 '2'유형이어야 함).
db:
image: postgres
web:
image: app
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
depends_on:
- migration
migration:
build: .
image: app
command: python manage.py migrate
volumes:
- .:/code
links:
- db
depends_on:
- db
이것은 깨끗하고 분리 된 것들을 유지하는 데 도움이됩니다. 고려해야 할 두 가지 :
올바른 시작 순서를 확인해야합니다 (dependencies_on 사용)
빌드 및 이미지를 사용하여 처음 라운드에 태그를 지정하여 여러 빌드를 피하려고합니다. 다른 용기의 이미지를 참조하면
대부분의 유닉스 기반 이미지 (알파인 등)에서 더 쉽게 사용할 수 있기 때문에 sh
반대로 사용 하는 것이 좋습니다 bash
.
예를 들면 다음과 같습니다 docker-compose.yml
.
version: '3'
services:
app:
build:
context: .
command: >
sh -c "python manage.py wait_for_db &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
다음 명령을 순서대로 호출합니다.
python manage.py wait_for_db
-DB가 준비 될 때까지 기다립니다.python manage.py migrate
-모든 마이그레이션을 실행python manage.py runserver 0.0.0.0:8000
-개발 서버를 시작하십시오
이것은 나를 위해 작동합니다 :
version: '3.1'
services:
db:
image: postgres
web:
build: .
command:
- /bin/bash
- -c
- |
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker-compose는 명령을 실행 하기 전에 변수를 역 참조하려고 시도 하므로 bash에서 변수를 처리하려면 달러 기호를 두 배로 늘려야합니다.
command:
- /bin/bash
- -c
- |
var=$$(echo 'foo')
echo $$var # prints foo
... 그렇지 않으면 오류가 발생합니다.
"web"서비스의 "command"옵션에 대한 잘못된 보간 형식 :
여기에서 진입 점을 사용할 수 있습니다. docker의 진입 점은 명령 전에 실행되는 반면 command는 컨테이너가 시작될 때 실행되어야하는 기본 명령입니다. 따라서 대부분의 응용 프로그램은 일반적으로 진입 점 파일에 설정 절차를 수행하고 마지막에는 명령 실행을 허용합니다.
쉘 스크립트 파일 docker-entrypoint.sh
을 다음 내용과 같이 (이름은 중요하지 않음)로 만들 수 있습니다 .
#!/bin/bash
python manage.py migrate
exec "$@"
docker-compose.yml 파일에서 그것을 사용 entrypoint: /docker-entrypoint.sh
하고 command: python manage.py runserver 0.0.0.0:8000
PS로 명령을 등록 docker-entrypoint.sh
하십시오 : 코드와 함께 복사하는 것을 잊지 마십시오 .
또 다른 아이디어 :
이 경우와 같이 컨테이너를 빌드하면 시작 스크립트를 배치하고 명령으로 실행하십시오. 또는 시작 스크립트를 볼륨으로 마운트하십시오.
둘 이상의 데몬 프로세스를 실행 해야하는 경우 Docker 설명서에 Supervisord 를 분리되지 않은 모드 로 사용하도록 제안 하면 모든 하위 데몬이 stdout으로 출력됩니다.
다른 SO 질문에서 하위 프로세스 출력을 stdout으로 리디렉션 할 수 있음을 발견했습니다. 그렇게하면 모든 출력을 볼 수 있습니다!
* 업데이트 *
일부 명령을 실행하는 가장 좋은 방법은 공식 CMD가 이미지에서 실행되기 전에 원하는 모든 작업을 수행하는 사용자 정의 Dockerfile을 작성하는 것입니다.
docker-compose.yaml :
version: '3'
# Can be used as an alternative to VBox/Vagrant
services:
mongo:
container_name: mongo
image: mongo
build:
context: .
dockerfile: deploy/local/Dockerfile.mongo
ports:
- "27017:27017"
volumes:
- ../.data/mongodb:/data/db
Dockerfile.mongo :
FROM mongo:3.2.12
RUN mkdir -p /fixtures
COPY ./fixtures /fixtures
RUN (mongod --fork --syslog && \
mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection videos --file /fixtures/videos.json)
아마도 가장 깨끗한 방법 일 것입니다.
* 구식 *
명령으로 쉘 스크립트를 만들었습니다. 이 경우 시작 mongod
하고 싶었지만 mongoimport
전화를 mongod
걸면 나머지는 실행되지 않습니다.
docker-compose.yaml :
version: '3'
services:
mongo:
container_name: mongo
image: mongo:3.2.12
ports:
- "27017:27017"
volumes:
- ./fixtures:/fixtures
- ./deploy:/deploy
- ../.data/mongodb:/data/db
command: sh /deploy/local/start_mongod.sh
start_mongod.sh :
mongod --fork --syslog && \
mongoimport --db wcm-local --collection clients --file /fixtures/clients.json && \
mongoimport --db wcm-local --collection configs --file /fixtures/configs.json && \
mongoimport --db wcm-local --collection content --file /fixtures/content.json && \
mongoimport --db wcm-local --collection licenses --file /fixtures/licenses.json && \
mongoimport --db wcm-local --collection lists --file /fixtures/lists.json && \
mongoimport --db wcm-local --collection properties --file /fixtures/properties.json && \
mongoimport --db wcm-local --collection videos --file /fixtures/videos.json && \
pkill -f mongod && \
sleep 2 && \
mongod
따라서이 몽고 포크, monogimport를 수행 한 다음 분리 된 포크 몽고를 죽이고 분리하지 않고 다시 시작합니다. 분기 프로세스에 연결하는 방법이 있는지 확실하지 않지만 작동합니다.
참고 : 일부 초기 DB 데이터를 엄격하게로드하려면 다음과 같이하십시오.
mongo_import.sh
#!/bin/bash
# Import from fixtures
# Used in build and docker-compose mongo (different dirs)
DIRECTORY=../deploy/local/mongo_fixtures
if [[ -d "/fixtures" ]]; then
DIRECTORY=/fixtures
fi
echo ${DIRECTORY}
mongoimport --db wcm-local --collection clients --file ${DIRECTORY}/clients.json && \
mongoimport --db wcm-local --collection configs --file ${DIRECTORY}/configs.json && \
mongoimport --db wcm-local --collection content --file ${DIRECTORY}/content.json && \
mongoimport --db wcm-local --collection licenses --file ${DIRECTORY}/licenses.json && \
mongoimport --db wcm-local --collection lists --file ${DIRECTORY}/lists.json && \
mongoimport --db wcm-local --collection properties --file ${DIRECTORY}/properties.json && \
mongoimport --db wcm-local --collection videos --file ${DIRECTORY}/videos.json
mongo_fixtures / *. json 파일은 mongoexport 명령을 통해 작성되었습니다.
docker-compose.yaml
version: '3'
services:
mongo:
container_name: mongo
image: mongo:3.2.12
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db:cached
- ./deploy/local/mongo_fixtures:/fixtures
- ./deploy/local/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh
volumes:
mongo-data:
driver: local
wait-for-it 또는 dockerize 와 같은 도구를 사용하십시오 . 이들은 작은 래퍼 스크립트이며 응용 프로그램 이미지에 포함 할 수 있습니다. 또는 고유 한 랩퍼 스크립트를 작성하여 더 많은 응용 프로그램 명령을 수행하십시오. https://docs.docker.com/compose/startup-order/ 에 따르면
jenkins 컨테이너를 jenkins 사용자로 도커 컨테이너를 빌드하도록 설정하는 동안이 문제가 발생했습니다.
나중에 docker-compose 파일에서 링크 할 때 Dockerfile의 docker.sock 파일을 터치해야했습니다. 내가 먼저 만지지 않으면 아직 존재하지 않았습니다. 이것은 나를 위해 일했습니다.
도커 파일 :
USER root
RUN apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release;
echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
RUN groupmod -g 492 docker && \
usermod -aG docker jenkins && \
touch /var/run/docker.sock && \
chmod 777 /var/run/docker.sock
USER Jenkins
docker-compose.yml :
version: '3.3'
services:
jenkins_pipeline:
build: .
ports:
- "8083:8083"
- "50083:50080"
volumes:
- /root/pipeline/jenkins/mount_point_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
";"을 사용해보십시오 당신이 두 가지 버전에있는 경우 명령을 분리하려면 예 :
command: "sleep 20; echo 'a'"
참고 URL : https://stackoverflow.com/questions/30063907/using-docker-compose-how-to-execute-multiple-commands
'development' 카테고리의 다른 글
힘내 별명 나열 (0) | 2020.02.22 |
---|---|
'클로저'란 무엇입니까? (0) | 2020.02.22 |
node.js를 사용하여 JSON을 예쁘게 인쇄하려면 어떻게해야합니까? (0) | 2020.02.22 |
Javascript / Chrome-웹킷 관리자에서 객체를 코드로 복사하는 방법 (0) | 2020.02.22 |
C ++에서 현재 시간과 날짜를 얻는 방법? (0) | 2020.02.22 |