Docker команда контейнера - это последняя строка в Dockerfile, а не инструкция CMD - PullRequest
0 голосов
/ 22 апреля 2020

Я недавно отсоединил свой внешний интерфейс и приложения 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

...