首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用docker卷nginx部署后,AWS EC2 ECR不更新文件

使用docker卷nginx部署后,AWS EC2 ECR不更新文件
EN

Stack Overflow用户
提问于 2022-03-15 23:23:48
回答 1查看 594关注 0票数 0

我被困在我的音量和ECS问题上。我想附加卷,以便我可以存储在那里,.env文件等,所以我不需要重新手动在每次部署。问题是,我设置它的方式不更新(或覆盖)文件,这些文件被推送到ECR。因此,如果我更改代码并将其推送到git,它会执行以下操作:

  1. 创建新的图像并将其推送给ECR
  2. 。当我在EC2上执行docker ps时,它会创建新的容器,并将图像推送到ECR (它会动态地为图像分配标记)
  3. ,而具有代码更改的容器是从刚刚被推送到ECR的正确图像生成的。因此,在此之前,一切似乎都很顺利。

但是,当我刷新浏览器或清除缓存后,代码更改都不会出现。

我正在将卷附加到位于我的应用程序所在的文件夹/var/www/html上,因此据我所知,在部署过程中应该替换这段代码。但问题是,它并没有取代代码。

当我删除卷时,每次部署完成时,我都可以看到代码更改,但我还必须手动创建.env文件+运行几个命令。

PS:我有另一个容器(mysql),它以完全相同的方式设置卷,即使在创建新容器之后,我在数据库中所做的更改也是持久的。

请查看我的Docker文件和taskDefinition.json,看看我如何处理卷。

Dockerfile:

代码语言:javascript
复制
FROM alpine:${ALPINE_VERSION}
# Setup document root
WORKDIR /var/www/html

# Install packages and remove default server definition
RUN apk add --no-cache \
  curl \
  nginx \
  php8 \
  php8-ctype \
  php8-curl \
  php8-dom \
  php8-fpm \
  php8-gd \
  php8-intl \
  php8-json \
  php8-mbstring \
  php8-mysqli \
  php8-pdo \
  php8-opcache \
  php8-openssl \
  php8-phar \
  php8-session \
  php8-xml \
  php8-xmlreader \
  php8-zlib \
  php8-tokenizer \
  php8-fileinfo \
  php8-json \
  php8-xml \
  php8-xmlwriter \
  php8-simplexml \
  php8-dom \
  php8-pdo_mysql \
  php8-pdo_sqlite \
  php8-tokenizer \
  php8-pecl-redis \
  php8-bcmath \
  php8-exif \
  supervisor \
  nano \
  sudo

# Create symlink so programs depending on `php` still function
RUN ln -s /usr/bin/php8 /usr/bin/php

# Configure nginx
COPY tools/docker/config/nginx.conf /etc/nginx/nginx.conf

# Configure PHP-FPM
COPY tools/docker/config/fpm-pool.conf /etc/php8/php-fpm.d/www.conf
COPY tools/docker/config/php.ini /etc/php8/conf.d/custom.ini

# Configure supervisord
COPY tools/docker/config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Make sure files/folders needed by the processes are accessable when they run under the nobody user
RUN chown -R nobody.nobody /var/www/html /run /var/lib/nginx /var/log/nginx

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN apk update && apk add bash

# Install node npm
RUN apk add --update nodejs npm \
 && npm config set --global loglevel warn \
 && npm install --global marked \
 && npm install --global node-gyp \
 && npm install --global yarn \
 # Install node-sass's linux bindings
 && npm rebuild node-sass

# Switch to use a non-root user from here on
USER nobody

# Add application
COPY --chown=nobody ./ /var/www/html/

RUN cat /var/www/html/resources/js/Components/Sections/About.vue

RUN composer install --optimize-autoloader --no-interaction --no-progress --ignore-platform-req=ext-zip --ignore-platform-req=ext-zip

USER root
RUN yarn && yarn run production

USER nobody

VOLUME /var/www/html

# Expose the port nginx is reachable on
EXPOSE 8080

# Let supervisord start nginx & php-fpm
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

# Configure a healthcheck to validate that everything is up&running
HEALTHCHECK --timeout=10s CMD curl --silent --fail http://127.0.0.1:8080/fpm-ping

taskDefinition.json

代码语言:javascript
复制
{
    "containerDefinitions": [
        {
            "name": "fooweb-nginx-php",
            "cpu": 100,
            "memory": 512,
            "links": [
                "mysql"
            ],
            "portMappings": [
                {
                    "containerPort": 8080,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [],
            "mountPoints": [
                {
                    "sourceVolume": "fooweb-storage-web",
                    "containerPath": "/var/www/html"
                }
            ]
        },
        {
            "name": "mysql",
            "image": "mysql",
            "cpu": 50,
            "memory": 512,
            "portMappings": [
                {
                    "containerPort": 3306,
                    "hostPort": 4306,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [
                {
                    "name": "MYSQL_DATABASE",
                    "value": "123"
                },
                {
                    "name": "MYSQL_PASSWORD",
                    "value": "123"
                },
                {
                    "name": "MYSQL_USER",
                    "value": "123"
                },
                {
                    "name": "MYSQL_ROOT_PASSWORD",
                    "value": "123"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "fooweb-storage-mysql",
                    "containerPath": "/var/lib/mysql"
                }
            ]
        }
    ],
    "family": "art_web_task_definition",
    "taskRoleArn": "arn:aws:iam::123:role/ecs-task-execution-role",
    "executionRoleArn": "arn:aws:iam::123:role/ecs-task-execution-role",
    "networkMode": "bridge",
    "volumes": [
        {
            "name": "fooweb-storage-mysql",
            "dockerVolumeConfiguration": {
                "scope": "shared",
                "autoprovision": true,
                "driver": "local"
            }
        },
        {
            "name": "fooweb-storage-web",
            "dockerVolumeConfiguration": {
                "scope": "shared",
                "autoprovision": true,
                "driver": "local"
            }
        }
    ],
    "placementConstraints": [],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "1536",
    "memory": "1536",
    "tags": []
}

所以我相信我设定音量的方式会有一些问题,或者可能会有一些许可问题?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-03-16 12:02:49

“我将卷附加到/var/www/html文件夹中,因此根据我的理解,在部署过程中应该替换这段代码。

这与码头容量的工作原理正好相反。

它将忽略码头映像中的/var/www/html中的任何内容,而是重用您在挂载的卷中拥有的任何内容。挂载卷主要用于在容器重新启动和图像更改之间持久化文件。如果正在构建的映像中的/var/www/html中有更新的代码,并且希望在部署应用程序时该更新代码处于活动状态,则不能将其作为卷挂载。

如果您要在您的VOLUME中指定Dockerfile指令,那么在容器中第一次运行容器时,它将使用停靠器容器中的文件“初始化”卷,作为创建卷过程的一部分。之后,主机服务器上卷中的文件将在容器重新启动/部署过程中持久化,并且忽略了对新码头映像中该路径的任何新更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71490121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档