Я недавно отсоединил свой внешний интерфейс и приложения API и немного изменил свой докер-файл. После обновления файла Docker, когда я запускаю docker-compose pull api
на моем сервере, который извлекает образ из размещенного реестра, команда, запущенная на docker-compose up
, является последней строкой моего файла Docker, а не оператором CMD, который я определил в начале файла.
Это происходит только тогда, когда я извлекаю свой удаленный образ, который прошел через CI / CD, когда образы api и webapp создаются локально, они работают правильно. Когда я извлекаю образ удаленного реестра и запускаю локально, я также получаю ту же ошибку.
Я убедился, что проверяю, что я запускаю одну и ту же ветку / commit для изображений api и webapp.
Текущий Dockerfile API:
FROM node:alpine AS base
EXPOSE 3000
ENTRYPOINT ["node"]
CMD ["server"]
ENV NODE_ENV production
HEALTHCHECK --start-period=5s \
CMD curl --fail localhost:3000/api/v1/health || exit 1
# Create app directory
RUN mkdir -p /app/dist
WORKDIR /app
# Install updates
RUN apk upgrade --no-cache && \
apk add --no-cache curl
COPY package.json \
package-lock.json \
/app/
# Install build dependencies
FROM base AS build
RUN apk add --no-cache git python make g++
# Install app dependencies
RUN npm install
# Make app
FROM base
COPY --from=build /app/node_modules /app/node_modules
ARG APP_VERSION
ARG DEPLOY_ENV
ENV DEPLOY_ENV=${DEPLOY_ENV}
ENV APP_VERSION=${APP_VERSION}
# Bundle app source
COPY migrations /app/migrations
COPY plugins /app/plugins
COPY lib /app/lib
COPY config /app/config
COPY api /app/api
COPY test /app/test
COPY server.js \
.eslintrc.json \
/app/
При сборке и запуске локально это создает команду docker image node server
, а при извлечении из реестра и запуске на моем удаленном сервере команда image node /bin/sh -c '#(nop) COPY multi:a9de3f777e34446d9ae1244926de602d7fe15f6557f4707ae1283a6d916e83fc in /app/
новая последняя строка файла Docker.
Мой старый файл Docker имел эту строку в качестве последней строки, когда он также работал правильно на удаленном сервере.
# Build webapp
RUN node_modules/.bin/webpack \
--mode=$NODE_ENV \
--env.appVersion=$APP_VERSION \
--env.deployEnv=$DEPLOY_ENV
Я не вижу, как это удалить строка изменила бы CMD
Журналы ошибок с docker logs {image}
- это одна и та же ошибка, повторяющаяся снова и снова.
SyntaxError: Invalid or unexpected token
at wrapSafe (internal/modules/cjs/loader.js:1039:16)
at Module._compile (internal/modules/cjs/loader.js:1087:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
at Module.load (internal/modules/cjs/loader.js:972:32)
at Function.Module._load (internal/modules/cjs/loader.js:872:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
/bin/busybox:1
ELF
^
Мой поставщик CI / CD - Gitlab, и это файл конфигурации
image: docker:latest
stages:
- build
- deploy
services:
- docker:19.03.5-dind
variables:
DOCKER_DRIVER: overlay2
GITLAB_IMAGE: "$CI_REGISTRY_IMAGE/$CI_BUILD_REF_NAME"
BUILD_IMAGE: "$CI_REGISTRY_IMAGE/build"
APP_VERSION: "$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHA"
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
- >
if [ "$CI_COMMIT_REF_SLUG" = "master" ]; then
DEPLOY_ENV="production"
elif [ "$CI_COMMIT_REF_SLUG" = "staging" ]; then
DEPLOY_ENV="staging"
else
DEPLOY_ENV="development"
fi
build: &build
stage: build
tags: [ docker ]
script:
# Cache "build" stage from registry
- docker pull "$BUILD_IMAGE:latest" || true
- docker build --target build --cache-from="$BUILD_IMAGE:latest" -t "$BUILD_IMAGE:latest" .
# Build pushed code
- |
docker build \
--cache-from "$BUILD_IMAGE" \
--build-arg APP_VERSION \
--build-arg DEPLOY_ENV \
-t "$GITLAB_IMAGE:$CI_COMMIT_SHA" .
# Run tests
- docker run --rm "$GITLAB_IMAGE:$CI_COMMIT_SHA" ./node_modules/.bin/mocha
# Publish new "build" cache only on production builds
- if [ "$CI_COMMIT_REF_NAME" = "master" ]; then docker push "$BUILD_IMAGE:latest"; fi
# Publish latest
- docker push "$GITLAB_IMAGE:$CI_COMMIT_SHA"
- docker tag "$GITLAB_IMAGE:$CI_COMMIT_SHA" "$GITLAB_IMAGE:latest"
- docker push "$GITLAB_IMAGE:latest"
# If tagged version then save
- >
if [ ! -z "$CI_COMMIT_TAG" ]; then
docker tag "$GITLAB_IMAGE:latest" "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG";
docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG"; fi
Развертывание этапов SSH на сервер и выполнение сценария, который извлекает последние изображения и запускает docker-compose up