Google 使用 Dockerfile 进行云构建并复制文件
Google Cloud Build with Dockerfile and copy files
我在使用 cloudbuild 和 dockerfile 设置部署时遇到问题。
我的Dockerfile
:
FROM python:3.8
ARG ENV
ARG NUM_WORKERS
ENV PORT=8080
ENV NUM_WORKERS=$NUM_WORKERS
RUN pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false && \
poetry install --no-dev
COPY ./.env.$ENV /workspace/.env
COPY ./app-$ENV.yaml /workspace/app.yaml
COPY . /workspace
ENTRYPOINT ["./entrypoint.sh"]
我的cloudbuild.yaml
:
steps:
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args:
- '-c'
- |
docker pull gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME || exit 0
- name: 'gcr.io/cloud-builders/docker'
args: [
'build',
'-t',
'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME',
'--cache-from',
'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME',
'--build-arg', 'ENV=develop',
'--build-arg', 'NUM_WORKERS=2',
'.'
]
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME']
- name: 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
id: RUN-LINTERS
entrypoint: sh
args: ['scripts/linters.sh']
- name: gcr.io/cloud-builders/docker
id: START-REDIS
args: ['run', '-d', '--network=cloudbuild', '--name=redisdb', 'redis']
- name: 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
id: RUN-TESTS
entrypoint: sh
args: ['scripts/run_tests.sh']
env:
- 'REDIS_HOST=redis://redisdb'
- 'DATASTORE_EMULATOR_HOST=datastore:8081'
waitFor:
- START-REDIS
- START-DATASTORE-EMULATOR
- name: gcr.io/cloud-builders/docker
id: SHUTDOWN-REDIS
args: ['rm', '--force', 'redisdb']
- name: gcr.io/cloud-builders/docker
id: SHUTDOWN-DATASTORE_EMULATOR
args: ['rm', '--force', 'datastore']
- name: 'gcr.io/cloud-builders/gcloud'
id: DEPLOY
args:
- "app"
- "deploy"
- "--image-url"
- 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
- "--verbosity=debug"
images: ['gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME']
timeout: "1000s"
问题是复制的文件 .env
和 app.yaml
没有出现在 workspace
中
我不知道为什么 cloudbuild 会忽略图像中的这些文件,因为我已经打印了 ls -a
并且看到文件在构建过程中被正确复制了,但是它们在 运行-tests 阶段消失了而且我也可以'在没有 app.yaml 的情况下部署
任何帮助请
您需要在 Dockerfile 中设置 WORKDIR /workspace
。
为了修复它,我刚刚在构建之前将它复制到 cloudbuild 中
- name: 'gcr.io/cloud-builders/gcloud'
id: MOVE-DOTENV-APP-YAML
entrypoint: bash
args:
- '-e'
- '-c'
- |
cp app-$_ENVIRONMENT.yaml app.yaml
cp .env.$_ENVIRONMENT .env
我在使用 cloudbuild 和 dockerfile 设置部署时遇到问题。
我的Dockerfile
:
FROM python:3.8
ARG ENV
ARG NUM_WORKERS
ENV PORT=8080
ENV NUM_WORKERS=$NUM_WORKERS
RUN pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false && \
poetry install --no-dev
COPY ./.env.$ENV /workspace/.env
COPY ./app-$ENV.yaml /workspace/app.yaml
COPY . /workspace
ENTRYPOINT ["./entrypoint.sh"]
我的cloudbuild.yaml
:
steps:
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args:
- '-c'
- |
docker pull gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME || exit 0
- name: 'gcr.io/cloud-builders/docker'
args: [
'build',
'-t',
'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME',
'--cache-from',
'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME',
'--build-arg', 'ENV=develop',
'--build-arg', 'NUM_WORKERS=2',
'.'
]
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME']
- name: 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
id: RUN-LINTERS
entrypoint: sh
args: ['scripts/linters.sh']
- name: gcr.io/cloud-builders/docker
id: START-REDIS
args: ['run', '-d', '--network=cloudbuild', '--name=redisdb', 'redis']
- name: 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
id: RUN-TESTS
entrypoint: sh
args: ['scripts/run_tests.sh']
env:
- 'REDIS_HOST=redis://redisdb'
- 'DATASTORE_EMULATOR_HOST=datastore:8081'
waitFor:
- START-REDIS
- START-DATASTORE-EMULATOR
- name: gcr.io/cloud-builders/docker
id: SHUTDOWN-REDIS
args: ['rm', '--force', 'redisdb']
- name: gcr.io/cloud-builders/docker
id: SHUTDOWN-DATASTORE_EMULATOR
args: ['rm', '--force', 'datastore']
- name: 'gcr.io/cloud-builders/gcloud'
id: DEPLOY
args:
- "app"
- "deploy"
- "--image-url"
- 'gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME'
- "--verbosity=debug"
images: ['gcr.io/$PROJECT_ID/my-repo:$BRANCH_NAME']
timeout: "1000s"
问题是复制的文件 .env
和 app.yaml
没有出现在 workspace
中
我不知道为什么 cloudbuild 会忽略图像中的这些文件,因为我已经打印了 ls -a
并且看到文件在构建过程中被正确复制了,但是它们在 运行-tests 阶段消失了而且我也可以'在没有 app.yaml 的情况下部署
任何帮助请
您需要在 Dockerfile 中设置 WORKDIR /workspace
。
为了修复它,我刚刚在构建之前将它复制到 cloudbuild 中
- name: 'gcr.io/cloud-builders/gcloud'
id: MOVE-DOTENV-APP-YAML
entrypoint: bash
args:
- '-e'
- '-c'
- |
cp app-$_ENVIRONMENT.yaml app.yaml
cp .env.$_ENVIRONMENT .env