如何配置Google Cloud VM容器以适配自定义docker run命令?
Google Cloud VM中配置Artifact Registry镜像的COMMAND/ARG设置
本地运行命令
我本地运行Docker镜像的命令是:
docker run --rm -d -p 80:80 mkdocs:latest nginx -g 'daemon off;'
遇到的问题
在使用Artifact Registry中的该镜像配置Google Cloud VM时,不知道如何正确设置COMMAND/ARG部分,尝试两种方法均失败:
- 将完整的
docker run --rm -d -p 80:80 mkdocs:latest nginx -g 'daemon off;'作为COMMAND,无法正常运行; - 设置
nginx、-g 'daemon off;'作为ARG,但不知道如何传递mkdocs:latest、-d、-p 80:80这些参数,同样无效。
另外,我尝试通过SSH连接VM也未能成功。
对应的Dockerfile
# MkDocs container FROM python:3-alpine AS build-env RUN apk add bash RUN apk add --no-cache make cmake ENV PATH="${PATH}:/usr/src/mkdocs/.local/bin" RUN pip install --upgrade pip RUN pip install pymdown-extensions \ && pip install mkdocs \ && pip install mkdocs-techdocs-core \ && pip install mkdocs-material \ && pip install mkdocs-rtd-dropdown \ && pip install mkdocs-git-revision-date-plugin \ && pip install mkdocs-git-revision-date-localized-plugin \ && pip install mkdocs-redirects \ && pip install mkdocs-video ENV PATH="${PATH}:/usr/src/mkdocs/.local/bin" RUN mkdir -p /home/mkdocs/ WORKDIR /home/mkdocs/ # Added for cloud run COPY . . RUN mkdocs build WORKDIR / ENTRYPOINT ["/usr/src/mkdocs/.local/bin/mkdocs"] # Nginx container FROM nginx:1.21.6-alpine RUN apk add bash EXPOSE 80 ENV USER=myuser ENV UID=7579 ENV GID=7579 RUN addgroup --gid "$GID" "$USER" && adduser --disabled-password --gecos "" --home "$(pwd)" --ingroup "$USER" --no-create-home --uid "$UID" -G "$USER" "$USER" RUN cat /etc/nginx/nginx.conf COPY nginx.conf /etc/nginx/nginx.conf WORKDIR / RUN mkdir -p /home/mkdocs COPY --from=build-env /home/mkdocs/site/ /home/mkdocs/ RUN mv /home/mkdocs/* /usr/share/nginx/html/ RUN chown nginx:nginx /usr/share/nginx/html/* RUN mkdir /tmp/nginx && chown nginx:nginx /tmp/nginx USER nginx:nginx
解决方案
1. 明确Docker命令各参数的作用
先拆解你本地的docker run命令,对应到GCP VM配置的不同环节:
--rm:容器退出后自动删除,GCP VM的容器生命周期由VM管理,无需额外设置;-d:让容器后台运行,GCP VM运行容器默认就是后台模式,不用单独配置;-p 80:80:端口映射,需分两步处理:- 给VM配置防火墙规则,开放80端口(允许外部访问VM的80端口);
- 创建VM时添加
--container-ports 80参数,确保容器的80端口映射到VM的80端口(你的Dockerfile已经EXPOSE 80,只需这一步即可);
mkdocs:latest:镜像名称,需替换为Artifact Registry的完整路径,格式为[REGION]-docker.pkg.dev/[PROJECT-ID]/[REPO-NAME]/mkdocs:latest,比如us-central1-docker.pkg.dev/my-project/my-repo/mkdocs:latest;nginx -g 'daemon off;':容器启动时执行的命令,用来覆盖镜像默认启动逻辑。
2. 正确设置COMMAND/ARG
在GCP VM的容器配置中:
- 镜像地址:填写Artifact Registry的完整镜像路径(不要用本地的
mkdocs:latest); - COMMAND:直接设置为
nginx -g "daemon off;"(用双引号避免转义问题),或者数组形式["nginx", "-g", "daemon off;"]。 - 不需要把完整的
docker run命令作为COMMAND,GCP会自动处理镜像拉取、容器启动等逻辑,你只需指定容器启动后要执行的命令。
3. SSH连接失败的解决办法
逐一检查以下项:
- VM是否有外部IP地址:内部IP无法直接从外部SSH连接;
- 防火墙规则是否开放22端口:确保有允许你的IP或0.0.0.0/0访问22端口的规则;
- SSH密钥配置:创建VM时是否添加了你的SSH公钥,或者使用
gcloud compute ssh [VM-NAME]命令自动生成密钥; - 网络标签:如果VM用了自定义标签,需确保防火墙规则的目标标签包含该标签。
内容的提问来源于stack exchange,提问作者Marcus Anthony
相关产品推荐
相关产品推荐

