docker-compose & pm2: 容器立即退出
docker-compose & pm2: container exiting immediately
我是一名初级前端开发人员,试图通过后端技能进行改进,为此我在 nodejs 中编写了 API,并使用 GitLab、AWS EC2、docker 和 pm2 来提供服务后端。
我 快 在 GitLab 中进行了基本的 CI/CD 设置,但我有一个问题,我的 docker 容器似乎正在立即退出在 运行 pm2 之后,我不知道如何让它持续存在。你能帮忙吗?
我的非常简单的 docker-compose.yml
看起来像这样:
version: '3.7'
services:
api:
image: some-repo/some-image:latest
我的 .gitlab-c.yml
看起来像这样:
image: docker:18.09.7
variables:
DOCKER_REPO: some-repo
IMAGE_BASE_NAME: some-image
IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:$CI_COMMIT_REF_SLUG
services:
- docker:18.09.7-dind
before_script:
- docker login -u "$DOCKER_REGISTRY_USER" -p "$DOCKER_REGISTRY_PASSWORD"
after_script:
- docker logout
stages:
- build
- deploy
build:
stage: build
script:
- docker build . -t $IMAGE -f $PWD/staging.Dockerfile
- docker push $IMAGE
- echo $PWD
deploy:
stage: deploy
variables:
RELEASE_IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:latest
script:
- docker pull $IMAGE
- docker tag $IMAGE $IMAGE
- docker push $IMAGE
- docker tag $IMAGE $RELEASE_IMAGE
- docker push $RELEASE_IMAGE
- apk add openssh-client
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- chmod 600 $AWS_KEY
- ssh-keyscan www.gitlab.com >> ~/.ssh/known_hosts
- ssh -i $AWS_KEY $AWS_URL "cd /home/ubuntu"
- ssh -i $AWS_KEY $AWS_URL "docker system prune -a -f"
- ssh -i $AWS_KEY $AWS_URL "docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD"
- ssh -i $AWS_KEY $AWS_URL "docker pull $RELEASE_IMAGE"
- ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose stop"
- ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose up -d"
- ssh -i $AWS_KEY $AWS_URL "docker logout"
我的 staging.Dockerfile
看起来像这样:
FROM node:latest
LABEL author="Mark Norgate"
WORKDIR /var/www/api
ENV ENVIRONMENT_CONFIG=staging
COPY ./src ./src
COPY ./package.json ./package.json
COPY ./tsconfig.json ./tsconfig.json
COPY ./.pm2/staging/ecosystem.config.js ./ecosystem.config.js
COPY ./credentials/some-credentials.json ./some-credentials.json
RUN npm install
RUN npm install --global typescript
RUN tsc -p .
RUN npm install --global pm2
EXPOSE 3001
EXPOSE 3002
EXPOSE 27017
ENTRYPOINT ["pm2", "start", "/var/www/api/ecosystem.config.js"]
我的 ecosystem.config.js
看起来像这样:
module.exports = {
apps : [{
name: 'API',
script: '/var/www/api/lib/server.js',
env: {
GOOGLE_APPLICATION_CREDENTIALS: '/var/www/api/some-credentials.json'
}
}]
};
现在看来一切正常;除了正如我所说的那样,一旦执行此 pm2
命令,容器就会退出。我认为这可能很简单,因为在分离模式下 运行 docker-compose up
,但这没有帮助。
有人能发现我的 error/omission 吗?
您可以尝试 pm2-runtime
而不是 pm2
以促进容器集成 - docs are here
我是一名初级前端开发人员,试图通过后端技能进行改进,为此我在 nodejs 中编写了 API,并使用 GitLab、AWS EC2、docker 和 pm2 来提供服务后端。
我 快 在 GitLab 中进行了基本的 CI/CD 设置,但我有一个问题,我的 docker 容器似乎正在立即退出在 运行 pm2 之后,我不知道如何让它持续存在。你能帮忙吗?
我的非常简单的 docker-compose.yml
看起来像这样:
version: '3.7'
services:
api:
image: some-repo/some-image:latest
我的 .gitlab-c.yml
看起来像这样:
image: docker:18.09.7
variables:
DOCKER_REPO: some-repo
IMAGE_BASE_NAME: some-image
IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:$CI_COMMIT_REF_SLUG
services:
- docker:18.09.7-dind
before_script:
- docker login -u "$DOCKER_REGISTRY_USER" -p "$DOCKER_REGISTRY_PASSWORD"
after_script:
- docker logout
stages:
- build
- deploy
build:
stage: build
script:
- docker build . -t $IMAGE -f $PWD/staging.Dockerfile
- docker push $IMAGE
- echo $PWD
deploy:
stage: deploy
variables:
RELEASE_IMAGE: $DOCKER_REPO/$IMAGE_BASE_NAME:latest
script:
- docker pull $IMAGE
- docker tag $IMAGE $IMAGE
- docker push $IMAGE
- docker tag $IMAGE $RELEASE_IMAGE
- docker push $RELEASE_IMAGE
- apk add openssh-client
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- chmod 600 $AWS_KEY
- ssh-keyscan www.gitlab.com >> ~/.ssh/known_hosts
- ssh -i $AWS_KEY $AWS_URL "cd /home/ubuntu"
- ssh -i $AWS_KEY $AWS_URL "docker system prune -a -f"
- ssh -i $AWS_KEY $AWS_URL "docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD"
- ssh -i $AWS_KEY $AWS_URL "docker pull $RELEASE_IMAGE"
- ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose stop"
- ssh -i $AWS_KEY $AWS_URL "/snap/bin/docker-compose up -d"
- ssh -i $AWS_KEY $AWS_URL "docker logout"
我的 staging.Dockerfile
看起来像这样:
FROM node:latest
LABEL author="Mark Norgate"
WORKDIR /var/www/api
ENV ENVIRONMENT_CONFIG=staging
COPY ./src ./src
COPY ./package.json ./package.json
COPY ./tsconfig.json ./tsconfig.json
COPY ./.pm2/staging/ecosystem.config.js ./ecosystem.config.js
COPY ./credentials/some-credentials.json ./some-credentials.json
RUN npm install
RUN npm install --global typescript
RUN tsc -p .
RUN npm install --global pm2
EXPOSE 3001
EXPOSE 3002
EXPOSE 27017
ENTRYPOINT ["pm2", "start", "/var/www/api/ecosystem.config.js"]
我的 ecosystem.config.js
看起来像这样:
module.exports = {
apps : [{
name: 'API',
script: '/var/www/api/lib/server.js',
env: {
GOOGLE_APPLICATION_CREDENTIALS: '/var/www/api/some-credentials.json'
}
}]
};
现在看来一切正常;除了正如我所说的那样,一旦执行此 pm2
命令,容器就会退出。我认为这可能很简单,因为在分离模式下 运行 docker-compose up
,但这没有帮助。
有人能发现我的 error/omission 吗?
您可以尝试 pm2-runtime
而不是 pm2
以促进容器集成 - docs are here